我试图理解apachespark的内部结构。我想知道spark在从inputformat读取或写入outputformat(或spark本机支持但不是从mapreduce派生的其他格式)时是否使用了一些机制来确保数据的局部性。
在第一种情况下(阅读),我的理解是,当使用inputformat时,split与包含数据的主机关联,因此spark尝试将任务分配给执行器,以便尽可能减少网络传输。
就写作而言,这种机制是如何运作的?我知道,从技术上讲,hdfs中的一个文件可以保存在本地的任何节点上,并复制到其他两个节点上(因此,您可以使用3个副本中的两个副本的网络),但是,如果您考虑写入其他系统,例如nosql数据库(cassandra、hbase、其他..),这样的系统有自己的数据分发方式。有没有一种方法可以告诉spark以一种基于输出接收器(目标nosql数据库,本机或通过outputformat看到的)所期望的数据分布优化数据局部性的方式来划分rdd?
我指的是spark节点和nosql节点生活在同一台物理机器中的环境。
1条答案
按热度按时间wlwcrazw1#
如果您在同一台物理机器上使用spark和cassandra,您应该检查spark-cassandra连接器它将确保读写的数据位置。
例如,如果您将一个cassandra表加载到一个rdd中,那么连接器将始终尝试在每个节点上本地对这个rdd执行操作。当您将rdd保存到cassandra中时,连接器也会尝试在本地保存结果。
假设您的数据已经在cassandra集群中平衡。如果您的partitionkey没有正确执行,您最终将得到一个不平衡的集群。
还要注意spark上的洗牌工作。例如,如果在rdd上执行reducebykey,那么最终还是会通过网络传输数据。所以,一定要仔细计划这些工作。