18
2021
02

Mapreduce数据倾斜原因和解决方案

原因:

    简单来说数据倾斜就是数据的key 的分化严重不均,造成一部分数据很多,一部分数据很少的局面。

    情形:group by 维度过小,某值的数量过多

    后果:处理某值的reduce非常耗时

    去重 distinct count(distinct xx)

    情形:某特殊值过多

    后果:处理此特殊值的reduce耗时

    连接 join

    情形1:其中一个表较小,但是key集中

    后果1:分发到某一个或几个Reduce上的数据远高于平均值

    情形2:大表与大表,但是分桶的判断字段0值或空值过多

    后果2:这些空值都由一个reduce处理,非常慢

解决:

    调优参数

  set hive.map.aggr=true:在map中会做部分聚集操作,效率更高但需要更多的内存。

  set hive.groupby.skewindata=true:数据倾斜时负载均衡,当选项设定为true,生成的查询计划会有两个MRJob。第一个MRJob 中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的GroupBy Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MRJob再根据预处理的数据结果按照GroupBy Key分布到Reduce中(这个过程可以保证相同的GroupBy Key被分布到同一个Reduce中),最后完成最终的聚合操作。


2、在 key 上面做文章,在 map 阶段将造成倾斜的key 先分成多组,例如 aaa 这个 key,map 时随机在 aaa 后面加上 1,2,3,4 这四个数字之一,把 key 先分成四组,先进行一次运算,之后再恢复 key 进行最终运算。

3、能先进行 group 操作的时候先进行 group 操作,把 key 先进行一次 reduce,之后再进行 count 或者 distinct count 操作。

4、join 操作中,使用 map join 在 map 端就先进行 join ,免得到reduce 时卡住。

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。