一、数据倾斜问题剖析
数据倾斜是分布式系统不可避免的问题,任何分布式系统都有几率发生数据倾斜,当然数据倾斜问题是在亿级数据造成机器无法应付这么多数据,这时发生数据倾斜,最后很难算出结果。
hive的原理机制是MR,在MR中最容易出现数据倾斜的就是reduce阶段,因为map到reduce会经过shuffle阶段,在shuffle中默认会按照key进行hash,如果相同的key过多,那么hash的结果就是大量相同的key进入到同一个reduce中,导致数据倾斜。当然map阶段也有可能发生数据倾斜,数据文件在进入map阶段之前会进行切分,默认是128M一个数据块,但是如果当对文件使用Gzip压缩等不支持文件分割操作的压缩方式时,MR任务读取压缩后的文件时,是对它切分不了的,该压缩智慧被一个任务所读取,如果有一个大的压缩文件被map读取时,就会发生map阶段的数据倾斜。
总结:
发生数据倾斜的原因有两种 :1、任务读取不可分割的大文件;2、任务中需要处理大量相同的key的数据。
二、怎么判断是否发生了数据倾斜
假如在hive sql的执行中可以使用explain来描述sql实际执行的整体轮廓,通过执行计划能了解sql程序在转换成相应计算引擎的执行逻辑,从而也能够更好的查看到出现的瓶颈,也就是通过explain定位问题来解决sql的优化。
三、explain
1、查看SQL的执行计划
explain:查看执行计划的基本信息
explain dependency:dependency在explain语句中使用会产生有关计划中输入的额外信息,显示了输入的各种属性。
explain authorization:查看SQL操作相关权限的信息。
explain vectorization:查看SQL的向量化描述信息,显示为什么未对Map和Reduce进行矢量化。
explain analyze:用实际的行数注释计划
explain cbo:输出由Calcite优化器生成的计划。
explain locks:了解系统将获得那些锁以运行指定的查询
explain ast:输出查询的抽象语法树
explain extended:加上extended可以输出有关计划的额外信息。
2 、explain的用法
explain select sum(id)from student;
四、 数据倾斜解决方案
在我们的整个hive执行过程中出现的数据倾斜问题还是比较多的,如:
1、空值引发的数据倾斜
2、不同数据类型引发的数据倾斜
3、不可拆分大文件引发的数据倾斜
4、数据膨胀引发的数据倾斜
5、表连接时引发的数据倾斜
6、无法减少数据量引发的数据倾斜