2017-03-16 82 views
1

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

也就是说,它正在考虑2块作为一个单一的分割,所以我环顾四周,发现下式用于计算所述分割尺寸,该尺寸如下:

分割尺寸= MAX(最小尺寸,分钟(MAXSIZE,块大小))

其中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

任何人都可以解释,为什么?

+0

它是什么类型的文件? –

+0

这是一个.csv文件@BinaryNerd – User9523

回答

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()方法知道的分裂是如何为每个文件分割。

+0

这(剩余字节数)是总文件大小? – User9523

+1

在这种情况下,由于文件大小很小,因此整个文件看起来像剩余的字节。例如:如果Filse大小为75MB,那么你将有2个分割。第一次分割将是'36MB',第二次分割将是'39MB'。剩余字节为每个拆分部分改变。请参阅更新的答案 – franklinsijo

+0

我们可以覆盖SPLIT_SLOP的值吗?最重要的是,我们应该超越这个价值吗? – User9523