1.前言
现在越来越多的作业都在使用spark/spark sql,希望借助于spark本身偏内存计算的特性来解决我们在数据生产中的性能问题。然而,世间没有能够解决一切问题的银弹,在使用spark的时候,我们本身也会遇见各种各样的问题。我们在使用spark的时候,如何能够快速发现spark的问题所在呢?本文提供了一些小小的技巧,希望能够帮助到大家。
2.一步一步发现问题
2.1 job页面找出执行最长的jobjob页面的duration是支持排序的,通过排序我们能够知道,那个作业执行最久,方便后续从stage和task方面做进一步的分析注意job之间的间隔,定位是否有文件数目不合理问题或者集群rpc是否有问题如果观察到spark job本身并没有特别慢的作业,那么需要关注一下作业之间的间隔。间隔指的是 上一个job的完成时间和下一个job的开始时间的时间差由上图可以发现,job 26的完成时间 02:39左右和27的启动时间 03:50 相差巨大,这也是引起作业性能瓶颈的原因。这时候可以通过driver的日志做进一步的定位。(文件数目过多,集群压力稍大的情况下文件写入会很耗时。)
小文件合并是否有坑vip的集群默认会开启小文件合并选项(set spark.sql.merge.output.enabled=false;),有时候,这也是一个性能瓶颈的问题所在,特别是针对半小时或者15分钟应用
小文件合并的作业一般是整个insert 语句完成的倒数第二个+第一个作业(经验),具体可以通过job的stage做进一步的确认。
一个经典的小文件合并的job如下(关注dag图):
2.2 stage列表 页面找执行时间最长的
2.3 task列表 页面关注数据分布
上图说明了stage的所有task的数据分布,能有效的帮助我们发现数据倾斜(时间大,数据量多)
关注task所在的机器通过对task的执行时长(duration)进行排序,看看慢的task是不是在一台机器上,有的时候,线上的机器会有坑
通过对task列表 error 列的处理,task 执行是否有错
2.4 log页面可以通过具体的task的strout 和strerr 来帮助我们发现一些问题