Mapreduce 创建输入拆分(HADOOP)

Mapreduce 创建输入拆分(HADOOP),mapreduce,hadoop2,Mapreduce,Hadoop2,我有一个大小39MB的文件,我将块大小设置为36MB。当文件上载到HDFS时,它成功地将文件存储在两个块中。现在,当我在此文件上运行Map Reduce作业(简单读取作业)时,作业计数器显示: “信息mapreduce.JobSubmitter:拆分数:1” 也就是说,它将两个块视为一个单独的分割,因此我四处查看,找到了计算分割大小的公式,如下所示: 拆分大小=最大值(最小值,最小值(最大值,块大小)) 其中minsize=mapreduce.input.fileinputformat.spli

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

也就是说,它将两个块视为一个单独的分割,因此我四处查看,找到了计算分割大小的公式,如下所示:

拆分大小=最大值(最小值,最小值(最大值,块大小))

其中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")
也就是说,minsize=1字节,maxsize=128 MB,因此根据公式,分割大小应该是36MB,因此应该有两个分割,但我得到的计数器输出仍然与以下相同:

信息mapreduce.JobSubmitter:拆分数:1


有人能解释一下原因吗?

文件的最后一次分割可能会溢出10%。 这称为
SPLIT\u 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;
}

请参阅方法以了解每个文件的拆分方式。

它是什么类型的文件?它是一个.csv文件@BinaryNerdThis(剩余字节)是文件的总大小?在这种情况下,由于文件大小很小,看起来整个文件都是剩余字节。例如:如果文件大小为
75MB
,则将有2个拆分。第一次拆分将为
36MB
,第二次拆分将为
39MB
。对于每个拆分分区,剩余的字节都会更改。参考更新的回答我们可以覆盖SPLIT_SLOP的值吗?最重要的是,我们应该覆盖该值吗?该值是硬编码的,没有提供覆盖的规定。好的。非常感谢您的投入!