发布时间:2022-11-08 14:00
数据倾斜是指在并行计算模式下(map-reduce框架,数据被切分为N个片段,分发到不同的计算节点上,单独计算),部分节点处理的数据量远大于其他节点,造成该节点计算压力过大,从而导致少数节点的运行时长远远超过其他节点的平均运行时长,进而影响整体任务产出时效,造成任务延迟,这个现象就是数据倾斜。
对于MaxCompute/ODPS来说,定位是否倾斜,只需要在logview中查看每个mapper/joiner/reducer 阶段的fuxi instance是否有long-tail / data-skews节点,若有,则一定是出现了数据倾斜。
对于hive,看任务执行的过程中如果一直在某个阶段卡在99%,那么大概率是出现了数据倾斜。
如果是joiner阶段长尾,Hive可以配合执行计划以及执行日志中定位是哪个阶段出现的倾斜,稍微有点麻烦,需要一点点定位,步骤大致如下。(手头没有集群无法截图。。)
1、从hive日志中定位长尾节点的"CommonJoinOperator: JOIN struct" 关键字。这里会打印该阶段的关联字段。
2、然后到执行计划中找到这几个字段所处的阶段和关联表名。
定位到是否有倾斜,以及在某个阶段出现的倾斜之后,就可以针对性的去优化。数据倾斜并不是简单的调整并行度就可以解决的,而是需要针对特定情况动态使用解决方案。
由于篇幅原因,后续我会出一个系列,开一个新坑,详细讲解各种阶段的数据倾斜的解决方案以及其他SQL性能调优实战方案,感兴趣的可以关注收藏一波。
如:
Map端长尾
Join端长尾优化
Reduce端长尾优化
....
如果我的文章对你有帮助,请帮忙转发/点赞/收藏,谢谢!