我正在尝试了解 Apache Spark 的内部结构。我想知道 Spark 是否使用某些机制来确保在从 InputFormat 读取或写入 OutputFormat(或 Spark native 支持但不是从 MapReduce 派生的其他格式)时的数据局部性。
在第一种情况(阅读)中,我的理解是,当使用 InputFormat 时,拆分与包含数据的主机(或主机??)相关联,因此 Spark 尝试将任务分配给执行程序以减少网络尽可能转移。
在写作的情况下,这种机制将如何运作?我知道从技术上讲,HDFS 中的文件可以保存在本地的任何节点中并复制到其他两个节点(因此您将网络用于 3 个副本中的两个),但是,如果您考虑写入其他系统,例如 NoSQL 数据库( Cassandra, HBase, others.. ),这些系统有自己的数据分布方式。有没有办法告诉 spark 根据输出接收器(目标 NoSQL 数据库, native 或通过 OutputFormat 查看)预期的数据分布以优化数据局部性的方式对 RDD 进行分区?
我指的是 Spark 节点和 NoSQL 节点位于同一物理机中的环境。
最佳答案
如果你在同一台物理机器上使用 Spark 和 Cassandra,你应该查看 spark-cassandra-connector它将确保读取和写入的数据局部性。
例如,如果您将 Cassandra 表加载到 RDD 中,连接器将始终尝试在每个节点上本地对该 RDD 执行操作。 当您将 RDD 保存到 Cassandra 中时,连接器也会尝试将结果保存在本地。
这假设您的数据已经在您的 Cassandra 集群中保持平衡。如果您的 PartitionKey 没有正确完成,无论如何您最终都会得到一个不平衡的集群。
还要注意 Spark 上的改组作业。例如,如果您在 RDD 上执行 ReduceByKey,无论如何您最终都会通过网络流式传输数据。因此,请始终仔细规划这些工作。
关于hadoop - Spark 是否使用数据局部性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27638281/