HIVE SQL 优化之数据倾斜

Posted 互联网数据之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HIVE SQL 优化之数据倾斜相关的知识,希望对你有一定的参考价值。

在hue查询过程中,经常会遇到一种情况:任务一直停留在99%,最后1%好几个小时都跑不完,甚至查询不出来结果。

这个时候,你可能遇到了【数据倾斜】


所谓数据倾斜,是大量的数据集中在了一台机器或者几台机器上,导致计算资源不均匀引起性能下降


MapReduce

任务的完成时间是取决于运行最长的那个Reduce完成情况。

流量日志中会记录用户的user_id,非注册用户占了绝大多数。以user_id作为group by的维度或者是join key,个别Reduce会收到比其他Reduce多得多的数据,因为它要接收所有user_id=0的记录进行处理,使得其处理效果会非常差,其他Reduce都跑完很久了它还在运行。


数据倾斜的解决方法,Hive提供了一些通用的解决方法,也可以通过自己改写Sql查询来实现。

原理基本有两种,1. 通过多增加一轮MapReduce任务完成,第一次Reduce时数据随机分发,第二轮Reduce才真正聚合。 2. 对特殊值启动单独的多个Reduce处理。


group by造成的倾斜解决方法:


Hive提供了通用的解决方案,设置set hive.map.aggr=true; 在Map端做combiner。
还可以设置set hive.groupby.skewindata=true; 在Reduce操作的时候,拿到的key并不是所有相同值给同一个Reduce,而是随机分发,然后Reduce做聚合,做完之后再做一轮MR,拿前面聚合过的数据再算结果。
也可以通过改写Sql来实现

 

join造成的倾斜解决方法:


设置set Hive.optimize.skewjoin = true; 其原理是特殊值先不在Reduce端计算掉,而是先写入hdfs,然后启动一轮Map join专门做这个特殊值的计算,期望能提高计算这部分值的处理速度。 根据Hive.skewjoin.key设置的数量Hive可以知道,比如默认值是100000,那么超过100000条记录的值就是特殊值。

上面是通用的算法,其实也可以自己动手写sql解决数据倾斜问题。

通过对特殊值增加随机数,使得这类数据能分散在多个Reduce中处理,避免了单个Reduce处理大量数据。


解决数据倾斜思路基本是一样的,就是想办法把特殊值数据分散到多个Reduce中。





以上是关于HIVE SQL 优化之数据倾斜的主要内容,如果未能解决你的问题,请参考以下文章

3Hive-sql优化,数据倾斜处理

3Hive-sql优化,数据倾斜处理

Hive之数据倾斜

Hive数仓-数据倾斜优化

如何处理hive中的数据倾斜

Hive架构倾斜优化sql及常见问题