HIVE参数非常多,但是日常使用的就那么几个,我自己常用的有这些,希望和大家多多交流、相互学习
1.set hive.exec.parallel=true;
开启并行job
set hive.auto.convert.join=true;
等同于mapjoin;大表和小表关联时使用;
set hive.mapjoin.smalltable.filesize=512000000;
控制mapjoin小表的大小
2. set hive.exec.parallel=true;
开启map端聚合
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
在map前先进行小文件合并,减少map数量,提升运行效率
set mapred.max.split.size=256000000;
每个map最大输入大小,决定了合并后生成多少个文件;
set mapred.min.split.size.per.node=256000000;
1个节点上split存储数据块的最小值,决定datanode是否要合并
set mapred.min.split.size.per.rack=256000000;
决定了交换机文件是否要合并
3. set hive.exec.reducers.bytes.per.reducer=51210001000
每个reduce处理数数据量,决定输出文件数量
hive.exec.reducers.max=1009
每个任务最大reduce数
set mapred.reduce.tasks = 15;
设定reduce个数,谨慎使用
4. set hive.exec.dynamic.partition=true;
开启动态分区;当HQL中有动态分区计算时使用
set hive.exec.dynamic.partition.mode=nonstrict;
所有分区都是动态的
set hive.exec.dynamic.partition.mode=strict;
至少有1个静态分区
5. hive.exec.compress.output=true;
压缩开关
6. 数据倾斜
set hive.optimize.skewjoin=true;
join倾斜时使用
set hive.skewjoin.key=500000;
set hive.skewjoin.mapjoin.map.tasks=10000;
set hive.skewjoin.mapjoin.min.split=33554432;
key阈值是50000,没超过50000的正常运行,超过50000的重新走mapjoin
set hive.groupby.skewindata=true;
groupby数据倾斜时进行负载均衡调节
【最好方法】对于异常的key在on时用随机数替代
7. 建表时用ORC列存储格式,此类列存储数据在物理存储是放在一起的,HIVE查询时只用查找指定列即可,提升查找运行效率
8. 压缩减少数据量,提速
set hive.exec.compress.output=true
对HIVE输出结果进行压缩
set hive.exec.compress.intermediate=true
对HIVE中间过程进行压缩
9.HQL运行很久时,检查on两边是否存在大量null参与计算,将null剔除或替换成随机数