在 spark 中优先分区/任务执行

Car*_* DM 6 partitioning distribution apache-spark pyspark

我有一份带有倾斜数据的火花工作。数据需要基于列进行分区。我想告诉 spark 首先开始处理最大的分区,以便我可以更有效地使用可用资源。

推理如下:我总共有 10000 个分区,其中 9999 个分区只需 1 分钟处理,1 个分区需要 10 分钟处理。如果我先得到重分区,我可以在 11 分钟内完成这项工作,如果我最后得到它需要 18 分钟。

有没有办法确定分区的优先级?你能理解这个吗?

我在电子表格上勾画了这两个场景在此处输入图片说明

jav*_*dba 5

你的推理是正确的:如果立即开始大任务,那么你的整体工作会更容易完成。但是,您无法控制任务的排序(/优先级)也是事实 - 因为 spark 任务调度程序不提供定义该排序的接口。


Cha*_*Ray 0

如果您的数据是倾斜的,即您的大部分数据存在于单个分区中,并且您的数据未在所有分区中平均分配。在这种情况下,您无法充分利用 Spark 并行化。

我总共有 10000 个分区,其中 9999 个分区只需要 1 分钟处理,1 个分区需要 10 分钟处理。如果我先得到重型分区,我可以在 11 分钟内完成这项工作,如果我最后得到它,则需要 18 分钟。

它不是那样工作的。每个分区将仅由一个任务或线程执行。因此,在您的情况下,所有其他任务都会完成,并且由于数据倾斜,只有任务需要时间才能完成。

处理和加快进程的方法。

  1. 均匀分布您的数据

    例如,如果您没有任何分区键,则将一个新列添加为您想要的序列号%numberOfpartitionsyouwant到您的数据帧。例如,如果您想要 10 个分区,那么

您想要的分区数量 = 10

因此每个数据将在数字 0 到 9 之间进行分区。然后使用这个新列按新数据帧进行分区。