是否可以将mapreduce作业的输出拆分为多个文件而不是单个'part-r-00000'文件?Splittig MapReduce输出到多个输出文件
我遇到了MultipleOutputFormat类,但从我读过的内容看来,它只是将输出分解为基于键的文件。 MultipleOutputFormat
我在找的是以WordCount作业为例,将输出分成多个文件。
是否可以将mapreduce作业的输出拆分为多个文件而不是单个'part-r-00000'文件?Splittig MapReduce输出到多个输出文件
我遇到了MultipleOutputFormat类,但从我读过的内容看来,它只是将输出分解为基于键的文件。 MultipleOutputFormat
我在找的是以WordCount作业为例,将输出分成多个文件。
原谅我,但通常你会得到尽可能多的part-r-nnnnn文件,因为你有减速器任务。如果字数统计示例只配置了一个reducer,则您只需配置多个(mapred.reduce.tasks或Hadoop 2等效项)即可。
我对Wordcount有类似的问题。在我的情况下,我需要将每个字母开头的单词写入单独的文件中。在这里我使用了MultipleOutputs
。
public class NameCountReducer extends Reducer<Text, NameCountTuple, Text, NameCountTuple> {
private NameCountTuple result = null;
private MultipleOutputs<Text,NameCountTuple> out;
public void setup(Context context) {
out = new MultipleOutputs<Text,NameCountTuple>(context);
}
public void reduce(Text key, Iterable<NameCountTuple> values, Context context)
throws IOException, InterruptedException {
int count = 0;
for (HITuple val : values) {
count += val.getCount();
}
result.setCount(count);
out.write(key, result,"outputpath/"+key.getText().charAt(0));
}
public void cleanup(Context context) throws IOException,InterruptedException {
out.close();
}
}
这给出了以下路径输出
outputpath/a
/b
/c
.......
为此,您应该使用LazyOutputFormat.setOutputFormatClass()
,而不是FileOutputFormat
。还需要添加作业配置为job.setOutputFormatClass(NullOutputFormat.class)
hi @TomSebastian。感谢您的帮助。实际上,我的MapReduce作业是一个简单的搜索工作,因此它只运行没有reduce任务的地图任务,我只是希望它将所有搜索结果输出到多个输出文件。尽管如此,谢谢你的信息。可能会提供使用,因为我继续构建程序 – Koh
谢谢大家对上述建议。
我所拥有的MapReduce作业实际上只是一个简单的搜索任务,地图任务会提取符合特定条件的输入行。然后简单地输出结果而不需要通过任何减少任务。
最初我没有设置减少任务数量,并从输出日志我可以看到它默认为1.我试图设置一个更高的数字,但它不会产生多个输出文件(部分000xx),但只有其中一个输出文件将包含所有结果,而其余的只是空文件。
然后,当我在下面设置它,它的工作。每个减少任务输出都是最终的输出文件。我真的不知道这是做了正确的方式,但我会把它现在作为一种解决方法
conf.set(“mapred.reduce.tasks”,“0”)
谢谢。我意识到,我一直将reducer任务作为默认值而没有设置值,所以它一直是1。 – Koh