是否可以在Spark阶段对任务重新排序

时间:2019-07-26 12:25:43

标签: scala apache-spark apache-spark-sql partitioning

我的问题是关于Spark阶段中任务的顺序。

上下文:

我有一个Spark数据帧,分为3000个分区。分区是对一个特定的Key进行的。我使用mapPartitionsWithIndex获取分区的id及其包含的元素数量。例如:

df.rdd
  .mapPartitionsWithIndex((i,rows) => Iterator((i,rows.size)))
  .toDF("id", "numElements")

当Spark在我的数据帧上运行其计算时,我在Spark UI中看到(我也做了一些测试以确保是这种情况),任务index对应于分区id,正好是与上述id获得的mapPartitionsWithIndex相同。因此,将按照给定执行器上分区的id递增顺序执行任务。

我看到分区中的行数与任务的执行时间之间有着明显的相关性。由于数据集的偏斜性质无法更改,因此我有几个分区的元素数量(> 8000)比平均值(〜3000)高得多。平均分区的执行时间为10-20分钟,较大的分区可以超过3小时。我的一些最大分区的id很高,因此相应的任务几乎在阶段结束时执行。结果,Spark Stages中的一个在最后5个任务上挂起3个小时。

问题:

是否可以对id个分区进行重新排序,以便首先执行最大分区中的任务?或等效地,有没有办法改变任务的执行顺序?

注意:

  • 我不需要将分区移动到其他节点或执行程序,只需更改执行顺序即可。
  • 我无法更改分区键
  • 我可以更改分区数,但问题仍然存在

我的设置:在带有提交提交的Mesos的Spark 2.2中。该作业在60个CPU上运行,每个执行程序有12个执行器,每个执行器有5个CPU。

1 个答案:

答案 0 :(得分:0)

不,没有。如果是这样,它现在将在文档中。

Spark的说法与Informatica不同。除非您在Spark Application中创建自己的线程,否则一个阶段必须完全完成才能开始下一个阶段。

8000似乎需要很长时间。