作者:蒋雨儿_824 | 来源:互联网 | 2023-09-12 12:17
大数据学习之路,不定时修改和增加内容,欢迎指正第4章 数据倾斜(重点)
绝大部分任务都很快完成,只有一个或者少数几个任务执行的很慢甚至最终执行失败,这样的现象为数据倾斜现象。
一定要和数据过量导致的现象区分开,数据过量的表现为所有任务都执行的很慢,这个时候只有提高执行资源才可以优化HQL的执行效率。
综合来看,导致数据倾斜的原因在于按照Key分组以后,少量的任务负责绝大部分数据的计算,也就是说产生数据倾斜的HQL中一定存在分组操作,那么HQL的角度,我们可以将数据倾斜分为单表携带了GroupBy字段的查询和两表(或者多表)Join的查询。
4.1 单表数据倾斜优化
4.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。
4.1.2 增加Reduce数量(多个Key同时导致数据倾斜)
1)调整reduce个数方法一
(1)每个Reduce处理的数据量默认是256MB
set hive.exec.reducers.bytes.per.reducer = 256000000
(2)每个任务最大的reduce数,默认为1009
set hive.exec.reducers.max = 1009
(3)计算reduce数的个数
N=min(参数 2,总输入数据量/参数 1)(参数 2 指的是上面的 1009,参数 1 值得是 256M)
2)调整reduce个数方法二
在hadoop的mapred-default.xml文件中修改
设置每个job的reduce个数
set mapreduce.job.reduces = 15;
4.2 Join数据倾斜优化
4.2.1 使用参数
在编写Join查询语句时,如果确定是由于join出现的数据倾斜,那么请做如下设置:
set hive.skewjoin.key=100000;
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;
4.2.2 MapJoin
详情见3.8节
MapJoin