我的问题是关于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。
答案 0 :(得分:0)
不,没有。如果是这样,它现在将在文档中。
Spark的说法与Informatica不同。除非您在Spark Application中创建自己的线程,否则一个阶段必须完全完成才能开始下一个阶段。
8000似乎需要很长时间。