产生原因:shuffle过程中部分key占比过大,导致计算集中到个别reducer或者executor上,拖慢了整体计算时间。
解决方法:
1、过滤少数导致倾斜的key:shuffle前将这些key排除掉,不对其进行计算。(hive的where字句,spark的filter)
2、提高shuffle操作的并行度:增加reducer数目、spark中给shuffle算子传入并行度参数,旨在减少每个计算单元分配到的key
3、随机前缀二次聚合法:对key加随机数前缀进行一次聚合,对结果去除前缀后再进行二次聚合
(在hive中set hive.groupby.skewindata=true;就是用二次聚合解决count(distinct) 的倾斜问题)
4、广播小表法:跳过shuffle直接达到join效果:broadcast实现mapper端join
5、拆分join(原理类似于分桶表):大表和大表关联时,拆分成并行的多个join,再将结果union all。例如将北京的账户和北京的现金join,其他分公司的账户和其他分公司的现金join,再将结果合并。
6、组合法:方法5中,对拆分出的倾斜部分再使用上述方法2/3/4。
https://blog.csdn.net/qq_35394891/article/details/82261571
集群加节点负载均衡:
#启动数据均衡,阈值 5% (不加即为默认的10%)
$HADOOP_HOME/bin/start-balancer.sh –threshold 5
#停止数据均衡
$HADOOP_HOME/bin/stop-balancer.sh
hive优化==================================================================
1、按日分区、按关联键分桶
2、尽早使用where等限制结果集大小,优先放到子查询中
3、拆分查询,大key与小key分开关联,大key采用map端join
count(distinct) 很容易出现倾斜问题,需在hive中set hive.groupby.skewindata=true;使用二次聚合的方式解决。