hive中常用的set设置

下面是常用的set设置优化hive,一般内存足够大的情况下建议使用spark引擎。如果数据量足够大,大于内存,则使用mapreduce;

--1.设置引擎为MR下,优化set如下
--打开动态分区后,允许所有分区都是动态分区模式
set hive.exec.dynamic.partition.mode = nonstrict;
-- 是否启动动态分区
set hive.exec.dynamic.partition=true;
--小文件合并参数
--设置map端输出进行合并,默认为true
--文件数目小,容易在文件存储端造成瓶颈,给HDFS带来压力,影响处理效率。对此,可以通过合并Map和Reduce的结果文件来消除这样的影响。
set hive.merge.mapfiles = true;
--设置reduce端输出进行合并,默认为false
set hive.merge.mapredfiles = true;
-- 开启并行执行:MapReduce阶段、抽样阶段、合并阶段、limit阶段等并行执行
set hive.exec.parallel=true;
--关闭并发,防止锁表
set hive.support.concurrency=false;
--是否在map端进行聚合默认是true。防止数据倾斜
hive.map.aggr=true;
--调整mapper和reducer的个数
--减少map数:下面三个参数确定合并文件块的大小,大于文件块大小128m的,按照128m来分隔,小于128m,大于100m的,按照100m来分隔,
--把那些小于100m的(包括小文件和分隔大文件剩下的)进行合并
set mapred.max.split.size=100000000;
set mapred.min.split.size.per.node=100000000; 
set mapred.min.split.size.per.rack=100000000;  
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; -- 执行前进行小文件合并 
--增加map数:当input的文件都很大, 任务逻辑复杂,map执行非常慢的时候,
--可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率
set mapred.reduce.tasks=10;
--增加reducer数
set mapred.reduce.tasks/mapreduce.job.reduces=?;
--每个reduce任务处理的数据量.默认1g
sethive.exec.reducers.bytes.per.reducer =1000000000;--1g
--每个任务最大的reduce数,默认为999
set hive.exec.reducers.max =?;
--每个任务最大的reduce数,默认为1009。
set Hive.exec.reducers.max=1009;
--调整reduce个数方法一
set  hive.exec.reducers.bytes.per.reducer=500000000; --(500M)
--调整reduce个数方法二
set mapreduce.job.reduces=15;--设置每个job的renduce个数
--严格模式:默认关闭禁止三种类型的查询:分区表不指定分区查询、笛卡尔积、使用order by
Set mapred.mode = strict;
--jvm重用:使用派生jvm来执行map和reduce任务
set mapred.job.jvm.numtasks=1;
--Joinon中有小表,则可以在map-side join执行过程中,将缓存到内存中的小表逐一匹配,从而可以省略所需要的reduce过程。Map Join优化, 不太大的表直接通过map过程做join
set hive.auto.convert.join = true;
set hive.auto.convert.join.noconditionaltask=true;

--2.设置引擎为spark:若内存允许,优先考虑使用spark
set hive.execution.engine=spark;
--小文件是HDFS的天敌,所以Hive原生提供了合并小文件的选项,合并小文件 
set hive.merge.sparkfiles=true--hive on Spark下则改用在内存中存储的近似大小.所以由MR迁移到Spark时要适当调高这个参数.由于HDFS上的数据很有可能被压缩或序列化
set hive.auto.convert.join.noconditionaltask.size = 100000000(100~200MB)

--如果一个简单查询只包括一个group by和order by,此处可以设置为1或2
hive.optimize.reducededuplication.min.reducer=4;
--如果数据已经根据相同的key做好聚合,那么去除掉多余的map/reduce作业
hive.optimize.reducededuplication=true;
--合并小文件
--hive.merge.mapfiles=true; --mr上
--hive.merge.mapredfiles=false
hive.merge.smallfiles.avgsize=16000000
hive.merge.size.per.task=256000000
hive.merge.sparkfiles=true;
--hive.merge.tezfiles=true; --tez上
set hive.merge.orcfile.stripe.level=true;
--Map Join优化, 不太大的表直接通过map过程做join
hive.auto.convert.join=true;
hive.auto.convert.join.noconditionaltask=true;
--可以被转化为HashMap放入内存的表的大小
hive.auto.convert.join.noconditionaltask.size=20M(might need to increase for Spark, 200M)
--如果数据按照join的key分桶,hive将简单优化inner join(官方推荐关闭)
set hive.optimize.bucketmapjoin= false;
hive.optimize.bucketmapjoin.sortedmerge=false;
--所有map任务可以用作Hashtable的内存百分比, 如果OOM, 调小这个参数(官方默认0.5)
hive.map.aggr.hash.percentmemory=0.5
--map端聚合(跟group by有关), 如果开启, Hive将会在map端做第一级的聚合, 会用更多的内存 
hive.map.aggr=true;
--hive0.13有个bug, 开启这个配置会对所有字段排序
hive.optimize.sort.dynamic.partition=false;
--新创建的表/分区是否自动计算统计数据
hive.stats.autogather=true
hive.stats.fetch.column.stats=true
hive.compute.query.using.stats=true;
--在order by limit查询中分配给存储Top K的内存为10%
hive.limit.pushdown.memory.usage=0.4 (MR and Spark)
--是否开启自动使用索引
hive.optimize.index.filter=true
--单个reduce处理的数据量 (影响reduce的数量) 
hive.exec.reducers.bytes.per.reducer=67108864
--Map Join任务HashMap中key对应value数量
hive.smbjoin.cache.rows=10000
--将只有SELECT, FILTER, LIMIT转化为FETCH, 减少等待时间
hive.fetch.task.conversion=more
hive.fetch.task.conversion.threshold=1073741824
--
hive.optimize.ppd=true



  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值