赞
踩
下面是常用的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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。