配置Hadoop将输入文件作为一个Map任务处理

时间:2014-03-19 16:20:29

标签: hadoop mapreduce

我正在使用单个200MB文件进行MapReduce。我的目标是完成1个地图任务。我做了:

Configuration conf = new Configuration();
conf.set("mapred.min.split.size","999999999999999");

但是,似乎记录的数量限制了我。它是拆分地图任务的原因吗?如果是这样,我该怎么做才能改变它?

14/03/20 00:12:04 INFO mapred.MapTask: data buffer = 79691776/99614720
14/03/20 00:12:04 INFO mapred.MapTask: record buffer = 262144/327680
14/03/20 00:12:05 INFO mapred.MapTask: Spilling map output: record full = true

1 个答案:

答案 0 :(得分:0)

mapred.min.split.size通常形成创建输入拆分的下限,而DFS块大小为128MB。因此,在您的情况下,下限超过上限,似乎hadoop并不关心它并且更高限制并相应地拆分输入数据。

引自wiki:

  

实际控制地图的数量是微妙的。该   mapred.map.tasks参数只是对InputFormat的一个提示   地图数量。默认的InputFormat行为是拆分总计   到正确数量的片段的字节数。但是,在   默认情况下,输入文件的DFS块大小被视为   输入拆分的上限。分割大小的下限可以是   通过mapred.min.split.size设置。因此,如果您期望10TB的输入数据   并且有128MB的DFS块,你最终会得到82k的地图,除非你的   mapred.map.tasks甚至更大。最终,InputFormat决定了   地图的数量。

你的提示在最后一句话中,所以如果你想控制地图制作者的数量,你必须覆盖InputFormat,一般我们使用FileInputFormatisSplittable() false需要重写方法以返回Class NonSplittableFileInputFormat extends FileInputFormat{ @Override public boolean isSplitable(FileSystem fs, Path filename){ return false; } } 。这将确保每个文件有一个映射器。 像下面这样的东西会很明显:​​

{{1}}