Hive/MaxCompute SQL性能优化(一):什么是数据倾斜

概念

数据倾斜是指在并行计算模式下(map-reduce框架,数据被切分为N个片段,分发到不同的计算节点上,单独计算),部分节点处理的数据量远大于其他节点,造成该节点计算压力过大,从而导致少数节点的运行时长远远超过其他节点的平均运行时长,进而影响整体任务产出时效,造成任务延迟,这个现象就是数据倾斜。

如何定位任务是否出现倾斜,在哪个阶段出现了倾斜?

对于MaxCompute/ODPS来说,定位是否倾斜,只需要在logview中查看每个mapper/joiner/reducer 阶段的fuxi instance是否有long-tail / data-skews节点,若有,则一定是出现了数据倾斜。

Hive/MaxCompute SQL性能优化(一):什么是数据倾斜_第1张图片

对于hive,看任务执行的过程中如果一直在某个阶段卡在99%,那么大概率是出现了数据倾斜。

Hive/MaxCompute SQL性能优化(一):什么是数据倾斜_第2张图片

如果是joiner阶段长尾,Hive可以配合执行计划以及执行日志中定位是哪个阶段出现的倾斜,稍微有点麻烦,需要一点点定位,步骤大致如下。(手头没有集群无法截图。。)

1、从hive日志中定位长尾节点的"CommonJoinOperator: JOIN struct" 关键字。这里会打印该阶段的关联字段。

2、然后到执行计划中找到这几个字段所处的阶段和关联表名。

如何解决数据倾斜?

定位到是否有倾斜,以及在某个阶段出现的倾斜之后,就可以针对性的去优化。数据倾斜并不是简单的调整并行度就可以解决的,而是需要针对特定情况动态使用解决方案。

由于篇幅原因,后续我会出一个系列,开一个新坑,详细讲解各种阶段的数据倾斜的解决方案以及其他SQL性能调优实战方案,感兴趣的可以关注收藏一波。

如:

Map端长尾

Join端长尾优化

Reduce端长尾优化

....

如果我的文章对你有帮助,请帮忙转发/点赞/收藏,谢谢!

你可能感兴趣的:(#,ODPS,hive,odps,数据倾斜,性能优化,SQL优化)