我正在使用单个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
答案 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
,一般我们使用FileInputFormat
和isSplittable()
false
需要重写方法以返回Class NonSplittableFileInputFormat extends FileInputFormat{
@Override
public boolean isSplitable(FileSystem fs, Path filename){
return false;
}
}
。这将确保每个文件有一个映射器。
像下面这样的东西会很明显:
{{1}}