如何应对Hive的数据倾斜

Hive的执行过程:

(1) Hive 将 HQL 转换成一组操作符(Operator),比如 GroupByOperator, JoinOperator 等

(2)操作符 Operator 是 Hive 的最小处理单元

(3)每个操作符代表一个 HDFS 操作或者 MapReduce 作业

(4)Hive 通过 ExecMapper 和 ExecReducer 执行 MapReduce 程序,执行模式有本地模式和分布式两种模式

Hive中数据倾斜问题:

1、数据倾斜的原因:
(1)、key分布不均匀。
(2)、业务数据本身的原因。
(3)、建表考虑不周。
(4)、某些SQL本身就有数据倾斜。

2、如何避免数据的倾斜:

(1)给key一个随机的值,打散key。

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

(3)SQL语句的调节:1、选用join key分布最均匀的表作为驱动表。2、大小表join的时候,让维度较小的表先进内存。3、大表join的时候,把空值的key变成一个字符串加上一个随机数,把倾斜的数据分到不同的reduce上。4、count distinct大量相同特殊值。

MySQL数据倾斜的原因与解决方法:

group by聚合倾斜

  • 分组维度少,维度的值很多,导致reduce时间很长
  • 其他节点会一直等待reduce没有完成的节点,所以会有100% map 99% reduce的情况
  • 解决办法:set hive.map.aggr=true;set hive.groupby.skewindata=true;

小文件过多

  • 合并小文件:set hive.merge.mapredfiles=true
  • 适当增加map的个数。解决方法:set mapred.map.tasks的个数
  • SQL中包含count(distinct),而数据量非常大并且特殊值太多,也会出现数据倾斜

使用sum代理group by,select a,sum(1) from(select a,b from t group by a,b) group by a;

原文地址:https://www.cnblogs.com/swordspoet/p/14479923.html