我正在尝试了解 Apache Spark 的内部结构。我想知道 Spark 是否使用某些机制来确保从 InputFormat 读取或写入 OutputFormat(或 Spark 本机支持的其他格式而不是从 MapReduce 派生的格式)时的数据局部性。
在第一种情况(阅读)中,我的理解是,当使用InputFormat时,分割与包含数据的主机(或多个主机??)相关联,因此Spark尝试将任务分配给执行器,以尽可能减少网络传输尽可能。
就写作而言,这样的机制如何运作?我知道从技术上讲,HDFS 中的文件可以本地保存在任何节点中并复制到其他两个节点(因此您使用网络进行 3 个副本中的两个),但是,如果您考虑写入其他系统,例如 NoSQL 数据库( Cassandra、HBase、其他..),此类系统有自己的数据分发方式。有没有办法告诉spark以一种基于输出接收器(目标NoSQL数据库,本机或通过OutputFormat看到)期望的数据分布优化数据局部性的方式对RDD进行分区?
我指的是 Spark 节点和 NoSQL 节点位于同一物理机器中的环境。
如果您在同一台物理机上使用 Spark 和 Cassandra,则应该查看Spark-Cassandra-连接器 https://github.com/datastax/spark-cassandra-connector它将确保读取和写入的数据局部性。
例如,如果您将 Cassandra 表加载到 RDD 中,连接器将始终尝试在每个节点上本地对该 RDD 执行操作。
当您将 RDD 保存到 Cassandra 中时,连接器也会尝试在本地保存结果。
假设您的数据已经在 Cassandra 集群中保持平衡。如果你的 PartitionKey 没有正确完成,你最终会得到一个不平衡的集群。
还要注意 Spark 上的混排作业。例如,如果您在 RDD 上执行 ReduceByKey,那么无论如何您最终都会在网络上传输数据。因此,请务必仔细计划这些工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)