近来,求职数据分析师常被问到:数据倾斜如何调优?对于经常使用HQL处理大数据的同学,这个问题并不陌生:任务进度长时间维持在99%,而查看监控页面,会发现只有某几个reduce子任务尚未完成,十分诡异。
要解决数据倾斜这个问题,我们需要先了解下数据倾斜产生的原因是什么?一般由于以下三个操作:count(distinct *), group by , join引起的,导致某个reducer处理的数据过多引起处理时间非常耗时。
因此解决调优的方式可以从3方面入手尝试:
1. 数据层面
- 有损方法:找到异常数据,符合业务场景的前提下,直接过滤
- 无损方法:对分布不均匀的数据,先对key做一层hash,先将数据打散增大并行度,再汇聚
2. 代码方面:
- 使用sum() group by 替代coun(distinct )
- 显式使用mapjoin:/*+mapjoin(x)*/
- 避免多表同时join,使用临时中间表过渡
3. 参数方面:
- 负载均衡:hive.groupby.skewindata=true
- map端聚合:hive.map.aggr = true
- 增加reduce 个数: hive.exec.reducer.max = / mapred.reduce.tasks =
- 采用压缩:hive.exec.compress.output = true /mapredu.output.compress = true (这个方式不完全是解决数据倾斜问题,减少IO读写和网络传输,提高效率)