小文件合并
--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%)
解决办法可以参考这个大佬写的,
3,小文件过多,导致mapper的数量巨大,占用过多资源,最终有可能被kill掉
开启mapper处理文件时合并小文件基本可以解决
4,reduce数量太多,也会导致运行慢,将ruduce设置大点,减少reduce数量
set hive.exec.reducers.bytes.per.reducer = 256000000;
参考文章:
Hive 数据倾斜问题定位排查及解决(实际案例):
Hive 常用参数整理:
大数据之Hive Mapper和Reducer数量设置:
hive2参数优化: