Hive常用调优、数据倾斜

一、Fetch抓取

Fetch抓取是指在某些情况下查询可以不必使用MapReduce计算。
参数设置: set hive.fetch.task.conversion=more;
例如:select * from emp;

二、本地模式

Hive 可以通过本地模式在单台机器上处理所有的任务。对于小数据集,可以提升执行效率。
参数设置:set hive.exec.mode.local.auto=true;

三、表的优化

1、两表join
	①空key过滤、空key转换。
	相同的key会发送到相同的reducer上,从而导致内存不够计算缓慢。
	②开启mapjoin。
	参数:set hive.auto.convert.join = true;
	set hive.mapjoin.smalltable.filesize=50000000;(默认50M以下认为是小表)
	③group by优化。
	开启map端聚合:
	set hive.map.aggr = true;
	在map端聚合的条数:
	set hive.groupby.mapaggr.checkinterval = 100000;
	开启数据倾斜时负载均衡:
	set hive.groupby.skewindata = true;
	④避免使用count(distinct)。
	count(distinct)操作是一个reduce task完成的,数据量大时,运行缓慢。
	一般使用先group by再count的方式替换。
	⑤避免笛卡尔积。
	避免使用join的时候不见on条件或无效的on条件。
	⑥行列过滤。
	列:select的时候只取需要的列,避免使用select *。
	行:使用join关联时,使用子查询先过滤再全表关联。
	⑦动态分区调整。
	开启动态分区:
	set hive.exec.dynamic.partition=true;
	设置非严格模式:
	set hive.exec.dynamic.partition.mode=nonstrict;
	整个MR节点,最大创建多少多态分区:
	set hive.exec.max.dynamic.partitions=1000;
	整个MR job,最大可以创建多少个HDFS文件:
	set hive.exec.max.created.files=100000
	⑧创建分区表。

四、数据倾斜

1、合理设置map、reduce个数。
	①map之前进行小文件合并。
	set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
	②复杂文件增加map数量。通过降低block块的大小增加map个数。
	set mapreduce.input.fileinputformat.split.maxsize=100;
	③调整reduce个数的方法。
	设置每个reduce默认处理的数据量:
	set hive.exec.reducers.bytes.per.reducer=256000000;
	设置每个任务的最大reduce数:
	set hive.exec.reducers.max=1009;
	修改hadoop的mapred-default.xml文件:
	set mapreduce.job.reduces = 15;
2、并行执行。
	设置参数 hive.exec.parallel 值为 true,就可以开启并发执行。使用注意:在共享集群中,如果 job 中并行阶段增多,那么集群利用率就会增加。需要在系统资源比较空闲的时候才有优势,否则,没资源,并行也起不来。
	set hive.exec.parallel=true; //打开任务并行执行 set 
	hive.exec.parallel.thread.number=16; //同一个 sql 允许最大并行度,默认为 8。
3、严格模式。
	默认是nonstrict非严格。	set hive.mapred.mode=strict
4、开启JVM重用。
	此方法适用于小文件或 task 特别多的场景,这类场景大多数执行时间都很短。
5、压缩。
	开启map输出压缩。
	开启reduce输出压缩。
6、随机给key分组:hive.groupby.skewindata=true
当选项设定为 true,生成的查询计划会有两个 MR Job。
第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的
第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。
7、参数调优:hive.map.aggr=true. Map端部分聚合,相当于Combiner
8、join产生数据倾斜:
大小表关联:可以使用Map Join让小的维度表(1000条以下的记录条数)先进内存。在map端完成reduce。
大表和大表关联:把空值NULL的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终结果。例如Demo1.空值数据倾斜。
9、空值数据倾斜:
场景:如日志中,常会有信息丢失的问题,比如全网日志中的user_id,如果取其中的user_id和bmw_users关联,会碰到数据倾斜的问题。
解决方法1: user_id为空的不参与关联。
解决方法2 :赋予空值新的key值。
10、不同数据类型关联产生数据倾斜:
场景:一张表s8的日志,每个商品一条记录,要和商品表关联。但关联却碰到倾斜的问题,s8的日志中有字符串商品id,也有数字的商品id,类型是string的,但商品中的数字id是bigint的。
问题原因:把s8的商品id转成数字id做hash来分配reduce,所以字符串id的s8日志,都到一个reduce上了,解决的方法验证了这个猜测。
解决方法:把数字类型转换成字符串类型。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值