在Spark中优先划分分区/任务执行

时间:2018-08-16 18:23:06

标签: apache-spark pyspark distribution partitioning

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

推理如下:我总共有10000个分区,其中9999个分区仅需要1分钟的处理时间,而1个分区则需要10分钟的处理时间。如果我首先获得沉重的分区,那么我可以在11分钟内完成工作,如果最后获得它,则需要18分钟。

是否有一种方法可以对分区进行优先级排序?这对您有意义吗?

我在电子表格上绘制了两种情况enter image description here

3 个答案:

答案 0 :(得分:2)

您的推理是正确的:如果立即执行大任务,那么您的总体工作将更加轻松。但是,您也无法控制任务的排序(/优先级),这是事实,因为spark任务计划程序没有提供定义该排序的接口。

答案 1 :(得分:0)

如果数据偏斜,即大多数数据都存在于单个分区中,并且数据没有在所有分区中均分,则无法充分利用Spark parallelizm。

我有10000个分区,其中9999个分区只需要1分钟即可处理,而1个分区则需要10分钟即可处理。如果首先获得较重的分区,则可以在11分钟内完成工作;如果最后获得,则需要18分钟。

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

如何处理和加快该过程。

  1. 均匀分发您的数据

    例如,如果您没有任何分区键,则将一个新列作为 sequence number%numberOfpartitionsyouwant 添加到数据框中。例如,如果您要10个分区,则

numberOfpartitionsyouwant = 10

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

答案 2 :(得分:0)

长时间运行的任务通常是数据偏斜的结果。正确的解决方案 是要重新分区数据以确保任务之间的均匀分配。

1.Evenly distribute your data using repartition as said by @Chandan
2.There might be encounter network issues while dealing with skewed data 
where an executor’s heartbeat times out.In such cases, consider increasing
your **spark.network.timeout** and **spark.executor.heartbeatInterval**.

重要建议寻找数据局部性级别。据我所知,位置级别指示执行了哪种类型的数据访问。当节点完成所有工作并且其CPU变得空闲时,Spark可能决定启动其他需要从其他位置获取数据的挂起任务。因此,理想情况下,您的所有任务都应在本地处理,因为它与较低的数据访问延迟相关。

您可以使用以下方法配置进入其他地区级别之前的等待时间:

spark.locality.wait

1.Spark在data locality上的官方文档

2。关于数据位置refer

的说明