hive 优化方法

hive查询操作优化
-------group by 优化---------
set hive.groupby.skewindata=true 如果是group by过程出现倾斜应该设置为true;
set hive.groupby.mapaggr.checkintenval=1000000; 这个是group的键对应的记录条数超过这个值则会进行优化


-----------join优化-------------------
 set hive.optimize.skewjoin=true;如果是join过程出现倾斜 应该设置为true
 set hive.skewjoin.key=1000000;--这个是join的键对应的记录条数超过这个值则会进行优化
-----------mapjoin-----------------
当表小于25mb的时候,小表自动注入内存
 set hive.auto.convert.join=true;
 set hive.mapjoin.smalltable.filesize=25mb;   默认值是25mb
----------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 job优化-----------------------------
----------并行化执行
每个查询被hive转化成多个阶段,有些阶段关联性不大,则可以并行化执行,减少执行时间
set hive.exec.parallel = true;
set hive.exec.parallel.thread.numbe=8;
本地化执行
    set hive.exec.model.local.auto = true;
当一个job满足如下条件才能真正使用本地模式:
    1、job的输入数据大小必须小于参数:
set hive.exec.mode.local.auto.inputbytes.max=128mb;(默认128MB)
    2、job的map数必须小于参数:
set hive.exec.mode.local.auto.tasks.max(默认4)
    3、job的reduce数必须为o或者1
------------------------------------------------
job合并输入小文件
set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
合并文件数由mapred.max.split.size限制的大小决定
job合并输出小文件
set hive.merge.smallfiles.avgsize=256000000;当输出文件平均大小小于该值,启动新job合并文件
set hive.merge.size.per.task=64000000;合并之后的文件大小
-------------------------------------------
JVM重利用
set mapred.job.reuse.jvm.num.tasks=20;
JVM重利用可以是JOB长时间保留slot,直到作业结束,这在对于有较多任务和较多小文件的任务是非常有意义的,减少执行时间。当然这个值不能设置过大,因为
有些作业会有reduce任务,如果reduce任务没有完成,则map任务占用的slot不能释放,其他的作业可能就需要等待。
---------------------------------------------
压缩数据
中间压缩就是处理hive查询的多个job之间的数据,对于中间压缩,最好选择一个节省CPU耗时的压缩方式
set hive.exec.compress.intermediate = true;
set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
set hive.intermediate.compression.type=BLOCK;
hive查询最终的输出也可以压缩
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set mapred.output.compression.type=BLOCK;
-------------------------------------------------
set mapred.map.tasks=10;
(1)默认map个数
default_num = total_size/block_size;
(2)期望大小
goal_num=mapred.map.tasks;
(3)设置处理的文件大小
split_size=max(mapred.min.split.size,block_size);
split_num=total_size/split_size;
(4)计算的map个数
compute_map_num = min(split_num,max(default_num,goal_num))
--------------------------------------------
Hive Map 优化
经过以上的分析,在设置map个数的时候,可以简单的总结为以下几点:
(1)如果想增加map个数,则设置mapred.map.tasks为一个较大的值。
(2)如果想减少map个数,则设置mapred.min.split.size为一个较大的值。
情况1:输入文件size巨大,但不是小文件
增大mapred.min.split.size的值
情况2:输入文件数量巨大,且都是小文件,就是单个文件的size小于blockSize。这种情况通过增大mapred.min.split.size不可行,需要使用CombineFileInputFormat将多个input path合并成一个
InputSplit送给mapper处理,从而减少mapper的数量。
--------------------------------------
map端聚合
set hive.map.aggr=true;
推测执行
mapred.map.tasks.speculative.execution
--------Hive Shuffle优化-------------------------------
Map端
io.sort.mb
io.sort.spill.percent
min.num.spill.for.combine
io.sort.factor
io.sort.record.percent


Reduce端
mapred.reduce.parallel.copies
mapred.reduce.copy.backoff
io.sort.factor
mapred.job.shuffle.input.buffer.percent
mapred.job.shuffle.input.buffer.percent
mapred.job.reduce.input.buffer.percent
--------------Hive Reduce优化------------
需要reduce操作的查询
聚合函数
    sum,count,distinct...
高级查询
    group by,join,distribute by,cluster by ...
    order by 比较特殊,只需要一个reduce
推测执行
    mapred.reduce.tasks.speculative.execution
    hive.mapred.reduce.tasks.speculative.execution


Reduce 优化
set mapred.reduce.tasks=10;直接设置
hive.exec.reducers.max
hive.exec.reducers.bytes.per.reducer 默认:1G
计算公式
numRTasks = min[maxReducers,input.size/perReducer]
maxReducers = hive.exec.reducers.max
perReducer = hive.exec.reducers.bytes.per.reducer
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值