我有一个大小 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 ”
任何人都可以解释原因吗?
答案 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()方法了解如何为每个文件划分拆分。