创建输入拆分(HADOOP)

时间:2017-03-16 07:41:31

标签: mapreduce hadoop2

我有一个大小 39MB 的文件,我将块大小设置为 36MB 。将文件上载到HDFS时,它会将文件成功存储在两个块中。现在,当我在此文件上运行Map-Reduce作业(简单读取作业)时,作业计数器显示: “ INFO mapreduce.JobSubmitter:拆分次数:1

也就是说,它将2个块视为单个分割,所以我环顾四周,找到了计算分割大小的公式,如下所示:

拆分尺寸=最大(minsize,min(maxsize,blocksize))

其中 minsize = mapreduce.input.fileinputformat.split.minsize maxsize = 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")

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

INFO mapreduce.JobSubmitter:拆分次数:1

任何人都可以解释原因吗?

1 个答案:

答案 0 :(得分: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()方法了解如何为每个文件划分拆分。