spark如何将分区分配给执行程序。
当我使用1个驱动程序和5个执行程序在spark shell中运行以下行时:
> var data = sc.textFile("file") // auto generates 2 partitions
> data.count() // materialize partitions on two nodes
> data = data.repartition(10) // repartition data.count()
> data.count() // 10 partitions still on original 2 nodes
重新分区后,10个分区仍位于原始的两个节点上(5个)。这看起来非常低效,因为在包含分区的每个节点上重复运行5个任务,而不是在节点之间均匀分布。对于在相同的rdds上重复多次的迭代任务,效率最低是显而易见的。
所以我的问题是,spark如何决定哪个节点具有哪个分区,有没有办法可以强制数据移动到其他节点?
答案 0 :(得分:0)
我只是在这里猜测一下,以显示逻辑(不一定是真正发生的事情)。
假设您的文件不是很大,即它适合1块HDFS。并假设该块被复制到2个节点。如果您想在第三个节点上进行处理,那么这意味着您需要复制它。由于计数是一个相对较快的计算,因此处理任务所需的时间可能相对较小。 Spark可能已经决定最好等待并在本地进行处理,而不是将数据混洗到其他节点(您可以配置此参数)。