hive map数量控制

459 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

新旧版本map数量获取区别:

Hadoop旧版中InputSplit的个数由下面三个参数决定:

goalSize:totalSize/numSpilt.totalSize为文件大小,numSplit为用户设定的map task个数,默认为1.

minSize:InputSplit的最小值,由配置参数 mapred.min.split.size,默认为1.

blockSize:HDFS中块的大小.

splitSize = max(minSize,min(goalSize,blockSIze))

新版:

maxSize:由配置参数mapred.max.split.size确定,已经不再考虑用户设定的map task个数.

minSize:InputSplit的最小值,由配置参数 mapred.min.split.size,默认为1.

blockSize:HDFS中块的大小.

splitSize = max(minSize,min(maxSize,blockSIze))
即
splitSize = max(mapred.min.split.size, min(mapred.max.split.size, dfs.block.size))

map数量:

mapred.min.split.size 或者 mapreduce.input.fileinputformat.split.minsize。
mapred.max.split.size 或者 mapreduce.input.fileinputformat.split.maxsize。
mapred.min.split.size.per.rack 或者 mapreduce.input.fileinputformat.split.minsize.per.rack。
mapred.min.split.size.per.node 或者 mapreduce.input.fileinputformat.split.minsize.per.node。
 
set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; --hive0.5开始就是默认值,执行map前进行小文件合并
----------------------------------------------------------------------
set mapred.max.split.size=256000000   --公司集群默认值
set mapred.min.split.size=10000000     --公司集群默认值
set mapred.min.split.size.per.node=8000000 --每个节点处理的最小split
set mapred.min.split.size.per.rack=8000000 --每个机架处理的最小slit.
------------------------------------------------------------------------
1.注意一般来说这四个参数的配置结果大小要满足如下关系。
max.split.size >= min.split.size >= min.size.per.rack>= min.size.per.node
 
2.这四个参数的作用优先级分别如下
max.split.size <= min.split.size <= min.size.per.rack <= min.size.per.node

如果对于Hive调优,想通过控制map个数进行调优,首先确定集群是否启动了压缩,且压缩的算法是否直接文件切分,然后再确定集群配置的默认的hive.input.format是什么实现类,不同实现类对于split的算法不同,当然控制map的参数也不同。所以对于控制map个数调优远远不是网上很多人说的那么简单。

参考 真正让你明白Hive参数调优系列1:控制map个数与性能调优参数