hive开启动态分区
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
Hive在基于输入文件大小的前提下将普通JOIN转换成MapJoin,并是否将多个MJ合并成一个hj
hive.auto.convert.join.noconditionaltask;
map join
select /*+ MAPJOIN */ u.user_name from log_user u join clean_log c on c.ip_address = u.ip_address;
在map join的字段前添加 /*+ MAPJOIN */(Hadoop2不需要)
map端部分聚合
set hive.map.aggr = true map端部分聚合,相当于Combiner
group by 优化
set hive.groupby.skewindata=true;
如果group by过程出现倾斜应该设置为true
set hive.groupby.mapaggr.checkinterval=100000;
这个是group的键对应的记录条数超过这个值则会进行优化
job并行
set hive.exec.parallel=true;
job合并输入小文件
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
job合并输出小文件
set hive.merge.smallfiles.avgsize=256000000;当输出文件平均大小小于该值,启动新job合并文件
limit
简单查询sql(只包含select)不启动MR引擎
指定reduce数量
set mapreduce.job.reduces = num;
或者set mapred.reduce.tasks=10;
每个reducer计算的文件量大小
set hive.exec.reducers.bytes.per.reducer 默认:1G
拓展:
sql在map reduce端的分布
from where 在map端
group by,sort,order by在reduce端