用spark做大数据处理,不怕数据大,就怕发生数据倾斜,一发生数据倾斜,轻则spark job要跑很久才能结束,重则OOM,把一个executor的存储空间撑爆,导致程序终止。
一个spark job 是由多个stage组成的 ,stage之间具有先后关系,所以是串行执行的 ,一个stage是由多个task 组成的,每个task之间可以并行运行,一个stage的运行时间由耗时最长的那个task来决定的。
如果出现了数据倾斜的话,使用SparkUI可以很明显的看到三个现象:
1 某个stage运行时间过长
2 shuffle read的数据量和shuffle write的数据量相差巨大
3 task运行时间过长,读写数据量相差巨大
从下图可以看到前两个现象:
1 大部分任务都是秒级完成,而正在执行的任务已经执行了17.8h
2 shuffle read的数据量只有7.2GB,但是shuffle write的数据量达到了3.7TB
点开这个可能发生了数据倾斜的stage,查看task的运行情况,可以看到第三个问题:
3 task运行时间过长,读写数据量相差巨大。可以看到红框里的task所需要的时间都是10h+,而其他都是分钟级;同时这几个task读写的数据量也出现了巨大的差异;所以是这几个task发生了严重的数据倾斜,拖慢了整个任务的执行时间。
刚刚上面也说过,任务执行的时间是由耗时最长的task决定的,所以要优化就需要优化该stage的这几个task,而具体如何优化,我们下次再讲。
文集
文章
参考文章