创建输入拆分 (HADOOP)

Creating input splits (HADOOP)

我有一个大小为 39MB 的文件,我将块大小设置为 36MB。当文件上传到 HDFS 时,它成功地将文件存储在两个块中。现在,当我在这个文件上 运行 一个 Map-Reduce 作业(简单的读取作业)时,作业计数器显示: “信息mapreduce.JobSubmitter:splits:1的数量”

也就是把2个block看成一个split,于是我查了一下split size的计算公式如下:

split size = max(minsize,min(maxsize,blocksize))

其中 minsize=mapreduce.input.fileinputformat.split.minsizemaxsize=minsize=mapreduce.input.fileinputformat.split.maxsize.

现在在我的 MR 代码中我设置了以下属性:

Configuration conf = new Configuration()
conf.set("mapreduce.input.fileinputformat.split.minsize","1")
conf.set("mapreduce.input.fileinputformat.split.maxsize","134217728")

那是最小大小=1 字节和最大大小=128 MB,所以根据公式,分割大小应该是 36MB,因此应该有两个分割,但我仍然得到相同的计数器输出:

"信息mapreduce.JobSubmitter:splits:1"的数量

谁能解释为什么?

文件的最后一次拆分可以溢出 10%。 这称为 SPLIT_SLOP 并设置为 1.1.

在这种情况下,

39MB (Remaining Bytes) / 36MB (Input Split Size) = 1.08 is less than 1.1 (SPLIT_SLOP)

因此整个文件被视为一个拆分。

关于如何拆分的片段,

long bytesRemaining = FileSize;
while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
  String[][] splitHosts = getSplitHostsAndCachedHosts(blkLocations,length-bytesRemaining, splitSize, clusterMap);
  splits.add(makeSplit(path, length-bytesRemaining, splitSize,splitHosts[0], splitHosts[1]));
  bytesRemaining -= splitSize;
}

参考getSplits()方法了解每个文件的拆分方式。