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=trueMR任务输出合并 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字段分发再算结果