Spark 是否使用数据局部性



我试图理解Apache Spark的内部结构。我想知道Spark在从InputFormat读取或写入OutputFormat(或Spark本身支持而不是从MapReduce派生的其他格式)时是否使用一些机制来确保数据局部性。

在第一种情况下(阅读),我的理解是,当使用InputFormat时,拆分与包含数据的主机(或主机??)相关联,因此Spark尝试将任务分配给执行程序,以便尽可能减少网络传输。

就写作而言,这种机制将如何运作?我知道从技术上讲,HDFS中的文件可以保存在本地的任何节点中并复制到其他两个节点(因此您将网络用于3个副本中的两个),但是,如果您考虑写入其他系统,例如NoSQL数据库(Cassandra,HBase等),这些系统有自己的数据分发方式。有没有办法告诉 spark 根据输出接收器(目标 NoSQL 数据库,本机或通过 OutputFormat 查看)预期的数据分布来优化数据局部性的方式对 RDD 进行分区?

我指的是Spark节点和NoSQL节点位于同一台物理机器中的环境。

如果你在同一台物理机器上使用Spark和Cassandra,你应该看看spark-cassandra-connector 它将确保读取和写入的数据局部性。

例如,如果将 Cassandra 表加载到 RDD 中,连接器将始终尝试在每个节点上本地执行此 RDD 上的操作。当您将RDD保存到Cassandra中时,连接器也会尝试在本地保存结果。

这是假设您的数据已经在 Cassandra 集群中平衡。如果您的分区键未正确完成,则最终仍会得到一个不平衡的群集。

还要注意 Spark 上的随机作业。例如,如果您在RDD上执行ReduceByKey,则最终仍会通过网络流式传输数据。因此,请始终仔细计划这些工作。

最新更新