我有一份数据偏斜的火花工作。数据需要基于列进行分区。我想告诉Spark首先开始处理最大的分区,以便可以更有效地使用可用资源。
推理如下:我总共有10000个分区,其中9999个分区仅需要1分钟的处理时间,而1个分区则需要10分钟的处理时间。如果我首先获得沉重的分区,那么我可以在11分钟内完成工作,如果最后获得它,则需要18分钟。
是否有一种方法可以对分区进行优先级排序?这对您有意义吗?
答案 0 :(得分:2)
您的推理是正确的:如果立即执行大任务,那么您的总体工作将更加轻松。但是,您也无法控制任务的排序(/优先级),这是事实,因为spark任务计划程序没有提供定义该排序的接口。
答案 1 :(得分:0)
如果数据偏斜,即大多数数据都存在于单个分区中,并且数据没有在所有分区中均分,则无法充分利用Spark parallelizm。
我有10000个分区,其中9999个分区只需要1分钟即可处理,而1个分区则需要10分钟即可处理。如果首先获得较重的分区,则可以在11分钟内完成工作;如果最后获得,则需要18分钟。
它不能那样工作。每个分区将仅由一个任务或线程占用执行空间。因此,在您这种情况下,所有其他任务都将完成,并且由于数据偏斜,只有一个任务将需要时间才能完成。
如何处理和加快该过程。
均匀分发您的数据
例如,如果您没有任何分区键,则将一个新列作为 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
的说明