导图社区 Hive调优
这是一篇关于Hive调优的思维导图,Hive是将符合SQL语法的字符串解析生成可以在Hadoop上执行的MapReduce的工具。
编辑于2022-02-17 17:05:29Hive调优
抓取机制 fetch
把hive.fetch.task.conversion设置成none,然后执行查询语句,都会执行mapreduce程序。 set hive.fetch.task.conversion=none; select * from score; select s_score from score; select s_score from score limit 3; 把hive.fetch.task.conversion设置成more,然后执行查询语句,如下查询方式都不会执行mapreduce程序。 set hive.fetch.task.conversion=more; select * from score; select s_score from score; select s_score from score limit 3;
本地模式 mapreduce
hive自动根据下面三个条件判断是否启动本地模式: The total input size of the job is lower than: hive.exec.mode.local.auto.inputbytes.max (128MB by default) The total number of map-tasks is less than: hive.exec.mode.local.auto.tasks.max (4 by default) The total number of reduce tasks required is 1 or 0.
join 查询优化
【注意】多个表关联时,最好分拆成小段sql分段执行,避免一个大sql(无法控制中间Job)
map side join

开启mapjoin参数设置: (1)设置自动选择mapjoin set hive.auto.convert.join = true; 默认为true (2)大表小表的阈值设置: set hive.mapjoin.smalltable.filesize= 25000000;
大表 join 大表

有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发送到相同的reducer上,从而导致内存不够。 此时我们应该仔细分析这些异常的key,很多情况下,这些key对应的数据是异常数据,我们需要在SQL语句中进行过滤。
大小表、小大表 join

在当下的hive版本中,大表join小表或者小表join大表,就算是关闭map端join的情况下,基本上没有区别了(hive为了解决数据倾斜的问题,会自动进行过滤)
group by 优化:map端聚合
默认情况下,当进行group by的时候,Map阶段同一Key数据分发给一个reduce,当一个key数据过大时就倾斜了。 但并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端进行部分聚合,最后在Reduce端得出最终结果。
1)是否在Map端进行聚合,默认为True set hive.map.aggr = true; 2)在Map端进行聚合操作的条目数目 set hive.groupby.mapaggr.checkinterval = 100000; 3)有数据倾斜的时候进行负载均衡(默认是false) set hive.groupby.skewindata = true;
MapReduce 引擎并行度调整
map task 个数调整
小文件场景: //每个Map最大输入大小(这个值决定了合并后文件的数量) set mapred.max.split.size=112345600; //一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并) set mapred.min.split.size.per.node=112345600; //一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并) set mapred.min.split.size.per.rack=112345600; //执行Map前进行小文件合并 set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
大文件场景: set mapreduce.job.reduces =10; create table a_1 as select * from a distribute by rand(123);
reduce task 个数调整
总共受3个参数控制: 1)每个Reduce处理的数据量默认是256MB hive.exec.reducers.bytes.per.reducer=256123456 2)每个任务最大的reduce数,默认为1009 hive.exec.reducers.max=1009 3)mapreduce.job.reduces 该值默认为-1,由hive自己根据任务情况进行判断。 因此,可以手动设置每个job的Reduce个数 set mapreduce.job.reduces = 8;
执行计划 explain
基本语法 EXPLAIN [EXTENDED | DEPENDENCY | AUTHORIZATION] query 案例实操 1)查看下面这条语句的执行计划 explain select * from course; explain select s_id ,avg(s_score) avgscore from score group by s_id; 2)查看详细执行计划 explain extended select * from course; explain extended select s_id ,avg(s_score) avgscore from score group by s_id;
并行执行机制
通过设置参数hive.exec.parallel值为true,就可以开启并发执行。不过,在共享集群中,需要注意下,如果job中并行阶段增多,那么集群利用率就会增加。 set hive.exec.parallel=true; //打开任务并行执行 set hive.exec.parallel.thread.number=16; //同一个sql允许最大并行度,默认为8。
严格模式
通过设置属性hive.mapred.mode值为默认是非严格模式nonstrict 。开启严格模式需要修改hive.mapred.mode值为strict,开启严格模式可以禁止3种类型的查询。 开启严格模式后: 1)对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行 2)对于使用了order by语句的查询,要求必须使用limit语句 3)限制笛卡尔积的查询
推测执行机制
hive本身也提供了配置项来控制reduce-side的推测执行: <property> <name>hive.mapred.reduce.tasks.speculative.execution</name> <value>true</value> </property>