HIVE使用优化总结

Hive使用注意点
(1)尽量尽早地过滤数据,减少每个阶段的数据量,对于分区表加上分区判断过滤不需要处理的数据。
(2)分区表关联在on条件上加上分区判断,否则会扫全表。
(3)避免一个SQL包含复杂逻辑,可以借助中间表来完成复杂的逻辑。
(4)建议使用外部表,防止误删表时删除数据;对于中间表可使用内部表的方式。

splitsize大小--切片大小( mapred.max.split.size 和mapred.min.split.size )

-->调大map个数(128MB~512MB/Task)
调小mapred.max.split.size
-->调小map个数
调大mapred.max.split.size  

-->在未指定reduce个数的情况下,计算公式如下:
reducers = Math.min(maxReducers, totalInputFileSize/bytesPerReducer)
maxReducers由参数hive.exec.reducers.max设置,默认999

bytesPerReducer由参数hive.exec.reducers.bytes.per.reducer 设置,默认1G

调整reduce个数(建议值 512MB~1GB/Task)
通过mapred.reduce.tasks或mapreduce.job.reduces设置

小文件合并——输入合并(输入大量小文件)
set hive.input.format = org.apache.hadoop.hive.ql.io.combinehiveinputformat;
set mapred.max.split.size = 536870912;  //512MB
set mapred.min.split.size = 134217728;  //128MB

小文件合并——输出合并(hive.merge.size.per.task)
Map-Only任务输出合并 set hive.merge.mapfiles=true
MR任务输出合并 set hive.merge.mapredfiles=true

hive.fetch.task.conversion有两种模式minimal(走MR)   &   more(不走MR)


Shuffle过程优化
优化方法
    中间结果压缩(集群默认开启)
(1)开启中间结果压缩:
set mapred.compress.map.output=true;

(2)设置中间结果压缩算法:
set mapred.compress.output.compression.codec=com.hadoop.compression.lzo.LzoCodec;

JOIN优化——大小表关联
两个表关联时,如果一个表非常大、另一个表非常小,可采用MapJoin。
小表放左边,开启参数hive.auto.convert.join(默认开启)。
小表文件大小小于hive.mapjoin.smalltable.filesize(默认25M)

数据倾斜——定位倾斜值
业务自己判断--->业务不清楚
如果sql:select ta.c1,ta.c2,tb.c2 from ta left join tb on ta.c1=tb.c2 
存在数据倾斜,怎么查出倾斜值?
select c2,count(*) as a from tb group by c2 order by a desc limit 20; 

数据倾斜优化 —— GroupBy
set hive.groupby.skewindata = true
先不按GroupBy字段分发,随机分发做一次聚合
额外启动一轮job,拿前面聚合过的数据按GroupBy字段分发再算结果

猜你喜欢

转载自blog.csdn.net/weixin_42553458/article/details/81002596