记录常用的HIVE set参数

记录常用的HIVE set参数

引擎为MR

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

引擎为spark

sethive.execution.engine=spark;--小文件是HDFS的天敌,所以Hive原生提供了合并小文件的选项,合并小文件sethive.merge.sparkfiles=true--hive on Spark下则改用在内存中存储的近似大小.所以由MR迁移到Spark时要适当调高这个参数.由于HDFS上的数据很有可能被压缩或序列化sethive.auto.convert.join.noconditionaltask.size=100000000(100~200MB)--如果一个简单查询只包括一个group by和order by,此处可以设置为1或2hive.optimize.reducededuplication.min.reducer=4;--如果数据已经根据相同的key做好聚合,那么去除掉多余的map/reduce作业hive.optimize.reducededuplication=true;--合并小文件--hive.merge.mapfiles=true; --mr上--hive.merge.mapredfiles=falsehive.merge.smallfiles.avgsize=16000000hive.merge.size.per.task=256000000hive.merge.sparkfiles=true;--hive.merge.tezfiles=true; --tez上sethive.merge.orcfile.stripe.level=true;--Map Join优化, 不太大的表直接通过map过程做joinhive.auto.convert.join=true;hive.auto.convert.join.noconditionaltask=true;--可以被转化为HashMap放入内存的表的大小hive.auto.convert.join.noconditionaltask.size=20M(might needtoincreaseforSpark,200M)--如果数据按照join的key分桶,hive将简单优化inner join(官方推荐关闭)sethive.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=truehive.stats.fetch.column.stats=truehive.compute.query.using.stats=true;--在order by limit查询中分配给存储Top K的内存为10%hive.limit.pushdown.memory.usage=0.4(MRandSpark)--是否开启自动使用索引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

————————————————
版权声明:本文为CSDN博主「从前慢」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_47952712/article/details/119670536