一、Hive调优:
影响Hive效率的几乎从不是数据量过大,而是数据倾斜、数据冗余、job或I/O过多、MapReduce分配不合理等等
大的方向分存储优化和计算优化。
存储优化:
- 生命周期管理
- 定期盘点,无用数据删除
- 模型相似度检测
- 数据压缩
- 模型重构
- 优化分层
计算优化:
- 分区裁剪、列裁剪 、谓词下推(where谓词逻辑都尽可能提前执行,减少下游处理的数据量)
- 在UNION ALL内部尽可能不使用GROUP BY,改为在外层统一GROUP BY
- 尽量避免使用DISTINCT关键字,改为多套一层GROUP BY 即 先进行group by 再进行count 替换count(distinct)。但是这样写会启动两个MR job(单纯distinct只会启动一个),所以要确保数据量大到启动job的overhead远小于计算耗时,才考虑这种方法。
- 减少FULL OUTER JOIN 的使用,改为UNION ALL
- 尽量少用 udf 和 transform脚本(这东西不好维护,能用sql实现就用sql)
- 开启combiner,map端预聚合 set hive.map.aggr,默认值true
- 合并小文件 小文件一多,会对NameNode的压力激增
二、数据倾斜:
数据倾斜:一大批数据分发到了一个reduce上,走到99% 不动了,形成性能瓶颈
形成原因:
- 关联键空值
- 数据分布不均匀
我们知道,join是数据倾斜的重灾区,常见的数据倾斜情况:
- 大小表关联,走map join,将小表在map端以hashtable的形式关联
- 大表和大表关联,空值引起的倾斜,过滤空key 或 随机打散
- 大表和大表关联,热点值引起的倾斜,分别计算热点数据和非热点数据,然后合并