一、hive表优化
分区:
静态分区
动态分区
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
分桶:
set hive.enforce.bucketing=true;
set hive.enforce.sorting=true;
二、hive sql优化
1.join优化
set hive.optimize.skewjoin=true;
set hive.skewjoinkey=100000; --这个是join键对应的条数超过这个值则会进行优化(多一个job)
mapjoin:
set hive.auto.convert.join=true;
hive.mapjoin.smalltable.filesize默认值是25mb
2.groupby优化
hive.groupby.skewindata=true; --goupby过程出现倾斜,设为true
set hive.groupby.mapaggr,checkinterval=100000; --groupby 键记录条数超过100000则进行优 化(多一个job)
3.count distinct优化
select count(1) from (selecy distinct id from a) temp;
select count(1) from (select id from a group by id) tmp;
4.针对多个count,优化(union all)
三、hive job优化
1.并行化执行
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=8; --设置并行数最大8个
2.本地化执行
set hive.exec.mode.local.auto=true;
本地化执行的条件是:
1> jobde 输入数据大小必须小于参数:
hive.exec.mode.local.auto.inputbytes.max(默认128MB)
2> job的map数必须小于参数:
hive.exec.mode.local.auto.tasks.max(默认4)
3> job的reduce数必须为0或者1
3.job合并
job合并输入小文件
set hive.input.format=
org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
合并文件数由mapred.max.split.size限制的大小决定
job合并输出小文件
set hive.merge.smallfiles.avgsize=256000000;--当输出文件平均大小小于256m,启动新job合并文件
set hive.merge.size.per.task=64000000;--合并之后的文件大小
4.JVM重利用
set mapred.job.reuse.jvm.num.tasks=20;
5.压缩数据
中间压缩,处理hive查询的多个job之间的数据
set hive.exec.compress.intermediate=true;
set hive.intermediate.compression.code=org.apache.hadoop.io.compress.SnappyCodec;
set hive.intermediate.compression.type=BLOCK;
hive最终的输出压缩
set hive.exec.compress.output=true;
set mapred.output.compression.code=org.apache.hadoop.io.compress.GzipCodec;
set mapred.output.compression.type=BLOCK;
四、hive map 优化
map个数计算:
compute_map_num= min(split_num,max(default_num,goal_num))
其中default_num=total_size/block_size
goal_num=mapred.map.tasks
split_size=max(mapred.min.split.size,block_size)
split_num=total_size/split_size
map端聚合(相当reudce)
set hive.map.aggr=true;
推测执行
mapred.map.tasks.speculative.execution
五、hive reduce优化
set mapred.reduce.tasks=10;
reduce个数计算:
numRtasks=min[maxReducers,input.size/perReducer]
其中maxReducers=hive.exec.reducers.max 默认:999
perReducer=hive.exec.reducers.bytes.per.reducer 默认:1G
推测执行
mapred.reduce.tasks.speculative.execution
hive.mapred.reduce.tasks.speculative.execution