为什么我在hadoop2中有这么多的Map器

2hh7jdfx  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(440)

我有这些设置

mapreduce.input.fileinputformat.split.maxsize  = 471192911 (449mb)
dfs.blocksize  = 134217728 (128mb)

我的每个文件都在附近 3500000000 (3.5G) 文件总长度为 2591561019810 (2.4T, 750 files) 在我开始hadoop工作之后,Map程序的总数是4820。
我知道如果hadoop使用splitsize作为449mb,那么Map程序的总数是有意义的。但是根据hadoop如何计算splitsize

Math.max(minSize, Math.min(maxSize, blockSize));

我的尺码应该是 Math(1, Math.min(449mb, 128mb)) = 128mb .
为什么我有449mb的大小?

mxg2im7a

mxg2im7a1#

要修复它,请更改minsize而不是maxsize,如下所示

mapreduce.input.fileinputformat.split.minsize  = 471192911 (449mb)
i7uaboj4

i7uaboj42#

我找到了原因。我得到这些数字的原因是我使用了combinefileinputformat。源代码显示拆分大小将不断累积,直到达到最大拆分大小。

j8ag8udp

j8ag8udp3#

从fileinputformat的grepcode:

/**
       * Generate the list of files and make them into FileSplits.
       */ 
      public List<InputSplit> getSplits(JobContext job
                                        ) throws IOException {
        long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
        long maxSize = getMaxSplitSize(job);

 public static long getMinSplitSize(JobContext job) {
    return job.getConfiguration().getLong(SPLIT_MINSIZE, 1L);
  }

public static final String SPLIT_MINSIZE ="mapreduce.input.fileinputformat.split.minsize";

protected long computeSplitSize(long blockSize, long minSize,
                                  long maxSize) {
    return Math.max(minSize, Math.min(maxSize, blockSize));
  }

发生这种情况的唯一可能性是: mapreduce.input.fileinputformat.split.minsize 应该是 449m

相关问题