小文件合并
--set hive.merge.sparkfiles = true;--spark引擎,结束后,新启动一个任务进行合并文件 set hive.merge.tezfiles = true;--tez引擎,结束后,新启动一个任务进行合并文件 --set hive.merge.mapredfiles = true;--在Map-Reduce的任务结束时合并小文件,mr引擎,结束后合并文件,新启动一个任务 set hive.merge.mapfiles = true;--在Map-only的任务结束时合并小文件 set hive.merge.size.per.task = 256000000;--合并后文件的大小 set hive.merge.smallfiles.avgsize=16000000;--当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge --也可以sql执行完成,执行overwrite sql进行小文件合并 insert overwrite table tableA select * From tableA;
mapper处理文件时合并小文件
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;--开启小文件合并 --set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;--不开启小文件合并
设置动态分区
set hive.exec.dynamic.partition.mode=nonstrict; --insert overwrite table tableA partition(分区字段) select ...
设置执行引擎
--set hive.execution.engine = mr;--设置执行引擎为mr set hive.execution.engine = tez;--设置执行引擎为tez --set hive.execution.engine=spark;--设置执行引擎为spark
设置hive的执行队列
set tez.queue.name=队列名称;-- 设置tez任务的执行队列: -- tez设置官网: -- https://tez.apache.org/releases/0.8.4/tez-api-javadocs/configs/TezConfiguration.html set mapreduce.job.queuename=队列名称;--设置mr,spark任务的执行队列 --set mapreduce.job.priority=HIGH;设置mr任务的优先级
map join相关
set hive.mapjoin.smalltable.filesize;--map join时小表的大小,默认25M
set hive.auto.convert.join;--设置是否开启map join
-- map join原理:MapJoin简单说就是在Map阶段将小表读入内存,顺序扫描大表完成Join。减少shuffle操作及reduce操作
其他可能有用的优化设置
set hive.mapred.reduce.tasks.speculative.execution;--设置是否开启推测执行 -- 为执行慢的任务启动一个备份任务,让该任务与原始任务同时处理同一份数据,并最终选用最先成功运行完成任务的计算结果作为最终结果 set hive.groupby.skewindata;--开启新的查询计划,在数据倾斜时,使负载均衡 --生成的查询计划会有两个MRJob。第一个MRJob 中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果, -- 这样处理的结果是相同的GroupBy Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的; -- 第二个MRJob再根据预处理的数据结果按照GroupBy Key分布到Reduce中(这个过程可以保证相同的GroupBy Key被分布到同一个Reduce中),最后完成最终的聚合操作 set hive.skewjoin.key;--超过10万行就认为该键是偏斜连接键 set hive.optimize.skewjoin;--启用倾斜连接优化 -- 不超过hive.skewjoin.key的key,走正常join流程,超过的hive.skewjoin.key的key,先写到hdfs上,然后再启动一个join,执行map join --hive并行执行相关设置 set hive.exec.parallel;--设置开启并行执行,常用于多个表join的场景,如果某几个Stage互不影响,hive就会并行执行提高执行效率。该参数默认关闭,提升效率的同时对资源的要求也会加大 set hive.exec.parallel.thread.number;--一个sql允许最大并行度,默认为8
hive sql执行慢原因
1,资源不足,导致任务一直在等待执行:
进入yarn页面,点击Scheduler,查看资源使用情况,若当前执行队列资源不足,可以切换执行队列
2,数据倾斜,导致执行缓慢(当执行过程中任务卡到了99%)
解决办法可以参考这个大佬写的,https://blog.csdn.net/yumingzhu1/article/details/119423814
3,小文件过多,导致mapper的数量巨大,占用过多资源,最终有可能被kill掉
开启mapper处理文件时合并小文件基本可以解决
参考文章:
Hive 数据倾斜问题定位排查及解决(实际案例):https://blog.csdn.net/yumingzhu1/article/details/119423814
Hive 常用参数整理:https://blog.csdn.net/BIT_666/article/details/109743647
大数据之Hive Mapper和Reducer数量设置:https://blog.csdn.net/qingdsj/article/details/103905056
hive2参数优化:https://www.cnblogs.com/wuxiaolong4/p/11565220.html



