2016-12-06 62 views
1

火花是如何将一个分区分配给执行者的。何时以及如何将火花分配给执行者

当我跑在火花壳以下行1个驱动器和第5个执行人:

> 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上重复多次的迭代任务是最明显的。

所以我的问题是,火花是如何决定哪个节点具有哪个分区的,有没有办法可以强制数据移动到其他节点?

+0

你说的是两个节点,但你有一个Executor,这没什么意义。他在谈论什么? –

+0

对不起,这是一个错字,刚刚编辑。感谢您指出 – Yituo

+0

您是否遇到Sparks任务分配问题?或者这是一个普遍的问题?每个Executor有多少个内核? –

回答

0

我只是在这里提供一个猜测来显示逻辑(不一定是真的发生了什么)。

让我们假设你的文件不是很大,也就是说它适合HDFS的1个块。并假定该块被复制到2个节点。如果你想在第三节点上进行处理,那么这意味着你需要复制它。由于count是一个相对较快的计算,因此处理任务所需的时间可能相对较少。 Spark可能已决定等待并在本地执行处理,而不是将数据混洗到其他节点(您可以配置此参数)。

+1

你知道我怎么配置这样它会洗牌?我想做一个重复性的迭代任务,因此需要洗牌 – Yituo