我正在尝试了解Apache Spark的内部结构.我想知道Spark是否在从InputFormat读取或写入OutputFormat(或Spark本身支持的其他格式而不是从MapReduce派生)时使用某些机制来确保数据局部性.
在第一种情况下(在读),我的理解是,使用InputFormat时,劈叉获得与主机,以便星火试图将任务分配给执行者,以减少网络传输尽可能多的相关的(或主机??)包含数据尽可能.
在写作的情况下,这种机制将如何运作?我知道从技术上讲,HDFS中的文件可以保存在本地的任何节点中并复制到其他两个(因此您可以将网络用于3个副本中的两个),但是,如果您考虑写入其他系统,例如NoSQL数据库( Cassandra,HBase,其他......),这类系统有自己的分发数据的方式.是否有一种方法来告诉火花分区在于优化由输出水槽预期数据的分布的基础上,数据局部性的方式的RDD(目标的NoSQL数据库,看到天然或通过OUTPUTFORMAT)?
我指的是一个环境,其中Spark节点和NoSQL节点存在于相同的phisical机器中.
如果您在同一台物理计算机上使用Spark和Cassandra,则应该检查spark-cassandra-connector它将确保读取和写入的数据位置.
例如,如果将Cassandra表加载到RDD中,则连接器将始终尝试在每个节点上本地对此RDD执行操作.当您将RDD保存到Cassandra时,连接器也会尝试在本地保存结果.
这假设您的数据已经在您的Cassandra集群中保持平衡.如果您的PartitionKey未正确完成,您最终将会得到一个不平衡的群集.
还要注意Spark上的洗牌工作.例如,如果您在RDD上执行ReduceByKey,那么无论如何您最终都会通过网络传输数据.所以,要小心计划这些工作.