把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;
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);
基本语法
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。