对hive输入格式设置为CombineHiveInputFormat的进行分析map数是如何计算的。
set hive.input.format=org.apache.hadoop.hive.al.io.CombineHiveInputFormat
注:对orcformat、外表和链接文件无法使用,会转到调用父类HiveInputFormat的getsplits()函数
map数与逻辑split数是一致的,决定map的主要因素有:
1、相关表或分区input的文件个数
2、input文件的大小
3、input文件在node和rack的分布
4、set mapred.max.split.size; 最大split大小
5、set mapred.min.split.size.per.node; 一个节点上最小的split大小
6、set mapred.min.split.size.per.rack; 一个机架上最小的split大小
例如:查询相关目录下有12个input file,每个input file的大小都在100M左右,block分布如下图:
情况一:参数设置如下:set mapred.max.split.size=256000000;
set mapred.min.split.size.per.node=64000000;
set mapred.min.split.size.per.rack=64000000;
第一步:遍历node,嵌套遍历block,当block的累加值大于max.split.size时,创建一个split,小于时,但如果大于min.size.per.node,创建一个新的split,小于时暂存block,继续下一个node。这个遍历过程每个node最多生成一个split,为提高并发度,让split尽量分布到不同的node上。
node I 有三个block(A、B、E)累加值300M > 256M, 会新建一个split。
node II 只有一个C block < 256M,会进行暂存
第二步:遍历rack,嵌套遍历block,对暂存的block进行分割,当block的累加值大于max.split.size时,创建一个新的split,小于时,但如果大于min.size.per.rack,创建一个新的split,小于时暂存block,继续下一个rack
rack I 三个block(C、D、G)累加值300M > 256M,会新建一个split,继续到下一个rack
第三步:对垮rack最后溢出的block处理,当block累加值大于max.split.size时创建新的split,循环处理,最后剩的数据创建一个split
源码请参照:
网友评论