bjkonglu / resume-bjkonglu

记录Spark、Flink研究经验
25 stars 7 forks source link

Spark任务因为某个Task执行时间很长导致整体Job处理时间过大问题处理方案 #10

Open bjkonglu opened 6 years ago

bjkonglu commented 6 years ago

背景

在执行Spark任务时,发现某个Stage里面的一个Task执行时间比同Stage里面的Task执行时间大几倍,最大会达到20倍。而Spark任务执行的原理是要求上一个Stage里面所有的Task都执行完,才能执行后续的Task,所以整体任务会因为单个Task的执行缓慢而延时。

分析

场景一

查看任务上游的数据是不是倾斜了,具体到每个partition里面的数据是否均衡。如果不是,说明数据发生倾斜,这个时候我们通过repartition操作,将每个partition里面的数据均衡

场景二

上游数据源每个partition里面的数据均衡,但是还是出现某个Stage里面的一个Task执行时间明显比其他Task执行时间长的情况。这个时候可以查看一下这个执行时间长的Task是不是都分配到同一个服务器上,如果是,说明该服务的性能不好,无法正常处理Task。

这个时候,我们可以启动Spark里面的推测功能(spark.speculation->true),该功能启动后Spar系统会检测每个Task的执行时间,如果Task的执行时间超过整个Stage所有Task平均执行时间的多少倍(由spark.speculation.multiplier参数控制),会启动另外一个Task处理相同数据,两个Task取最前完成的那个Task处理结果,另一个Task被Kill

处理后的结果

screen shot 2018-10-12 at 6 19 32 pm