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