Hive调优梳理:
- 高效的文件格式
- 中间压缩格式
- GZip压缩率高,消耗CPU更高
- Snappy压缩率和CPU消耗更均匀
- 根据业务创建分区表
- 根据业务创建分桶表
- 保证map扫描尽量少
- 高效的文件格式
- 压缩格式
- 列裁剪
- 分区裁剪
- 分桶
- 保证map传给reduce的数据量尽量小
1. 避免笛卡尔积
2. 谓词下推
set hive.optimize.ppd=true
一种逻辑优化,尽早对底层数据进行过滤以减少后续以减少后续需要处理的数据量
3. map端聚合功能
set hive.map.aggr=true
在map中会做部分聚合操作,能够使map传送给reduce的数据量大大减少
4. 使用Hive合并输入格式
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
5. 合并小文件
- 保证map和reduce处理的数据量尽量均衡
- 合理调整map和reduce占用的计算资源,调整数量
- 调整map和reduce的内存
- 调整map和reduce的虚拟核数
mapreduce.map.cpu.vcores & mapreduce.reduce.cpu.vcores
(不要超过yarn.nodemanager.resource.cpu-vcores)
- 使用稳定成熟的Hive优化特性
1. 相关性优化器(set hive.optimize.correlation=true) 输入相关性、作业流程相关性
2. 基于代价的优化(set hive.cbo.enable=true) 基于(FS读写、CPU)等代价对查询计划优化
3. 向量化查询引擎(set hive.vectorized.execution.enabled=true)
对数据处理是以行为行为,依次处理。向量化特性通过每次处理1024行数据,列方式处理,从而减少了方法的调用,降低了CPU消耗,提高利用率(减少扫描、过滤、聚合和关联的CPU使用率)
4. Join相关优化(mapjoin,semi-join)
5. Multiple Insert特性
6. TableSample抽样查询
7. Limit优化
启动limit优化,使用limit不再是全表查出,而是抽样查询。
set hive.limit.optimize.enable=true;
set hive.limit.row.max.size=10000;
set hive.limit.optimize.limit.file=10;
8. 局部排序(Sort by,Distribute by)
关键参数:
- map内存大小:maprecue.map.memory.mb
- reduce内存大小:mapreduce.reduce.memory.mb
- Container内存大小:yarn.scheduler.maximum-allocation-mb
- map虚拟核数:mapreuce.map.cpu.vcores
- reduce虚拟核数:mapreduce.reduce.cpu.vcores
- Container虚拟核数:yarn.scheduler.maximum-allocation-vcores
- Map处理的最大数据量:mapreduce.input.fileinputformat.split.maxsize
- 每个节点Map分片最小值:mapred.min.split.size.per.node
- 每个机架Map分片最小值:mapred.min.split.size.per.rack
- 每个reduce任务处理的数据量:hive.exec.reducers.bytes.per.reducer
- 最大reduce数:hive.exec.reducers.max
- reduce任务数量:mapred.reduce.tasks
经验:
- 当输入数据量较大时减少Map处理的最大数据量
- 当大量重复数据做去重时减少Reduce数量
- 当大量匹配记录做关联时增加Reduce数量
- 当出现Join倾斜时打开Join倾斜优化开关
- 当Join和Group By字段一致时打开相关性能优化开关