0 简介
绝大部分任务都很快完成,只有一个或者少数几个任务执行的很慢甚至最终执行失败,这样的现象为数据倾斜现象。
一定要和数据过量导致的现象区分开,数据过量的表现为所有任务都执行的很慢,这个时候只有提高执行资源才可以优化 HQL 的执行效率。
综合来看,导致数据倾斜的原因在于按照 Key 分组以后,少量的任务负责绝大部分数据的计算,也就是说产生数据倾斜的 HQL 中一定存在分组操作,那么从 HQL 的角度,我们可
以将数据倾斜分为单表携带了 GroupBy 字段的查询和两表(或者多表)Join 的查询。
1 单表数据倾斜优化
1.1 使用参数
当任务中存在 GroupBy 操作同时聚合函数为 count 或者 sum 可以设置参数来处理数据倾斜问题
是否在 Map 端进行聚合,默认为 True set hive.map.aggr = true; 在 Map 端进行聚合操作的条目数目 set hive.groupby.mapaggr.checkinterval = 100000;
有数据倾斜的时候进行负载均衡(默认是 false)
set hive.groupby.skewindata = true;
当选项设定为 true,生成的查询计划会有两个 MR Job。
2 Join 数据倾斜优化
2.1 使用参数
在编写 Join 查询语句时,如果确定是由于 join 出现的数据倾斜,那么请做如下设置:
# join 的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置 set hive.skewjoin.key=100000; # 如果是 join 过程出现倾斜应该设置为 true set hive.optimize.skewjoin=false;
如果开启了,在 Join 过程中 Hive 会将计数超过阈值 hive.skewjoin.key(默认 100000)的
倾斜 key 对应的行临时写进文件中,然后再启动另一个 job 做 map join 生成结果。通过hive.skewjoin.mapjoin.map.tasks 参数还可以控制第二个 job 的 mapper 数量,默认 10000。
set hive.skewjoin.mapjoin.map.tasks=10000;
2.2 MapJoin
详情见 3.9 节