Open bjkonglu opened 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
背景
在执行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
处理后的结果