Hive的十四种调优方式:

参考:https://www.cnblogs.com/smartloli/p/4356660.html  Hive性能优化

  https://blog.youkuaiyun.com/l1028386804/article/details/80629279?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task  Hive之——Hive SQL优化

https://blog.youkuaiyun.com/javastart/article/details/76727458  Hive 调优总结

第一种调优方式:fetch(hive可以避免MapReduce)对于hive可以简单地读取employee对应的储存目录下的文件,然后输出查询结果到控制台.修改hive.fetch.task.conversion默认是more,老版本为minimal,修改为more即可

第二种:本地模式(在hive输入数据量是非常小的情况下,可以通过本地模式处理单台机器上所有的任务,设置hive.exec.mode.local.auto)的值为true,在让hive在适当的时候自动启动这个优化,可以设置最大输入数据量为134217728,即128M,还有设置local mr的最大输入文件个数,当输入文件个数小于这个值是采用local mr的方式,默认是4

第三种:表的优化


1.小表join大表
将key相对分散,并且数据量小的表join的左边,这个可以有效减少内存溢出错误发生的几率,在进一步可以使用group让小的维度表(1000条以下的记录条数)先进内存,在map端完成reduce

mapjoin(map端执行join)
启动方式一:(自动判断)
set.hive.auto.convert.join=true;
hive.mapjoin.smalltable.filesize 默认值是25mb
小表小于25mb自动启动mapjoin 
启动方式二:(手动)
select /*+mapjoin(A)*/ f.a,f.b from A t join B f on (f.a=t.a)

mapjoin支持不等值条件
reduce join不支持在ON条件中不等值判断

2.多个表关联时,最好分拆成小段,避免大sql(无法控制中间job)
3.大表join大表
(1)过滤掉为空key的值
(2)空key转换,对应的数据不是异常数据是,必须要包含join的结果中,此时我们可以表a中key为空的字段赋一个随机的值,是的数据随机地分到不同的reduce上.

第四种:group的调优
    (1)是否在Map端进行聚合,默认为True
    set hive.map.aggr = true;
    (2)在Map端进行聚合操作的条目数目
    set hive.groupby.mapaggr.checkinterval = 100000;
    (3)有数据倾斜的时候进行负载均衡(默认是false)
    set hive.groupby.skewindata = true;
     (4)开启Mapjoin功能
     set hive.auto.convert.join=true;默认为true
     group By在默认情况下,map阶段同一key数据分发给一个reduce,当一个key数据过大时,就倾斜了.
     1)开启Map端聚合参数设置
     (1)是否在map端进行聚合,默认为true
     (2)在map端进行聚合操作的条目数目
     (3)有数据倾斜的时候,进行负载均衡

第五种:count distinct  尽量转换成  count  group  by来完成

  1. hive.group.skewindata=true; 如果是group by过程出现倾斜,应该设置为true

  2. set hive.groupby.mapaggr.checkinterval=100000; 这个是group的键对应的记录条数超过这个值则会进行优化

优化前

select count(distinct id) from tablename;
优化后
select count(1) from (select distinct id from tablename) tmp;
select count(1) from (select id from tablename group by id) tmp;
优化前
select a, sum(b), count(distinct c), count(distinct d) from test group by a;
优化后
select a, sum(b) as b, count(c) as c, count(d) as d
from(
select a,0 as b, c, null as d from test group by a,c
union all
select a,0  as b, null as c, d from test group by a, d
union all
select a,b,null as c, null as d from test
)tmp1 group by a;

第六种:避免笛卡尔积,任何时候都要避免join的时候后面的on条件无效或者不带on条件

第七种优化:使用分,列裁剪,不要使用select  *  如果查询的是分区表,一定要记得带上分区条件

第八种调优:动态的分区调整,就是以第一个表的分区规则,来对应第二个表的分区规格,将第一个表的所有分区,全部拷贝到第二个表中,第二个表在加载数据的时候,不需要指定分区了,直接用第一个表的分区即可.
(1)开启动态分区功能
(2)设置为非严格模式
(3)在所有执行mr的节点上,最大一共可以创建多少个动态分区
(4)在每个执行mr的节点上,最大可以创建多少个动态分区
(5)整个mr job中,最大可以创建多少个hdfs文件
(6)当有空分区生成是,是否抛出异常,一般不需要设置


第九种调优:设置hive输入数据的小文件的合并,设置map的个数以及reduce个数
1)    参数设置(下面的API属于hadoop低版本的API)
set mapred.max.split.size=112345600;
set mapred.min.split.size.per.node=112345600;
set mapred.min.split.size.per.rack=112345600;
set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
对于一个文件,大小为120M是,但是包含几千万的记录,如果用1个map去处理这个任务,肯定比较耗时,这种情况下,我们要考虑将这个一个文件合理拆分成多个,这样就可以用多个map去完成,对于map 的数量控制需要按实际情况去处理.是大数据量利用合适的map数,使单个map任务处理合适的数据量
2)reduce个数
调整reduce个数方法一
每个reduce处理的数据量默认是256MB
每个任务最大的reduce数默认是1009
计算reduce数的公式
n=min(reduce数,总输入数据量 / 参数1每个reduce处理的默认数据量)
调整reduce个数方法二
在hadoop的mapred-default.xml文件中修改
设置每个job的reduce个数
set mapreduce.job.reduces=15;
处理大数据量利用合适的reduce数,使单个reduce任务处理数据量大小要合适

第十种调优:hive任务的并行执行,设置hive.exec.parallel值为true,就可以开启并发执行,但在共享集群汇总,如果job中并行阶段增多,那么集群的利用率就会增加.set.hive.exec.parallel.thread.number=16;同一个生气了允许醉的并行度

第十一种调优:设置hive的严格模式 set hive.mapred.mode=strict
1)对于分区表,除非where语句汇总含有分区字段过滤条件来限制范围,否则不允许执行
2)对于使用了order by语句的查询,要求必须使用limit语句
3)限制笛卡尔积的查询

第十二种调优:设置jvm的重用    set
jvm重用可以使得jvm实例在同一个job中重新使用N次
mapred.job.reuse.jvm.num.tasks=10;

第十三种调优:关闭推测执行

第十四种调优:压缩和文件存储格式,压缩使用snappy 文件存储格式使用ORC

中间压缩就是处理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;


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值