hive map数的计算-combinehiveinputformat

对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分布如下图:

《hive map数的计算-combinehiveinputformat》

情况一:参数设置如下: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

源码请参照:

CombineFileInputFormat.java

    原文作者:gina_石头
    原文地址: https://www.jianshu.com/p/f0fe3b644a47
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞