美文网首页
hive map数的计算-combinehiveinputfor

hive map数的计算-combinehiveinputfor

作者: gina_石头 | 来源:发表于2018-07-20 17:12 被阅读0次

    对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

    源码请参照:

    CombineFileInputFormat.java

    相关文章

      网友评论

          本文标题:hive map数的计算-combinehiveinputfor

          本文链接:https://www.haomeiwen.com/subject/jayfmftx.html