前言
本文的意图在于根据常见hive作业运行场景,介绍hive以及hadoop的参数设置方法。
Group by数据倾斜:
如果需要group by的字段有一个值或一些值出现的频率很高:
可以用hive.groupby.skewindata参数平衡数据。
Map,Reduce数控制:
如果需要减小Map的数量:
MRv1.0:
set mapred.min.split.size=<Long>
MRv2.0:
set mapreduce.input.fileinputformat.split.minsize=<Long>
(相反,如果把min换成max就是增大map的数量,建议尽量减少map数)
如果需要限制map的数量:
MRv1.0:
MRv2.0:
set mapreduce.job.maps=<number>
如果需要限制reduce的数量:
MRv1.0:
set mapred.reduce.tasks=<number>
MRv2.0:
set mapreduce.job.reduces=<number>
对于某些有数据倾斜的字段:
如A表与B表左外连接时:
A left outer join B on A.col1=B.col1;
如果A.col1有大量null值会照成倾斜,可以把A.col1为null的值拿出来单独处理,如:
A left outer join B on A.col1=B.col1 and A.col1 != null
union all
select * from A where A.col1 = null;
如果A表与B表内连接时:
A join B on A.col1=B.col1
同样,如果Acol1有大量的null值可以这么处理:
A join B on case when A.col1 is NULL then concat('NULL',rand()) else A.col1 end = B.col1
反正NULL不参与连接,所以这么处理后随机值也连接不上不仅分散了数据而且不影响最后结果。