是否可以将mapreduce作业的输出拆分为多个文件而不是单个'part-r-00000'文件?
我遇到过MultipleOutputFormat类,但是根据我的阅读,它似乎只是根据键将输出分解为文件。 MultipleOutputFormat
我正在寻找的是,以WordCount作为例子,将输出分成多个文件。
答案 0 :(得分: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)
答案 1 :(得分:1)
请原谅我,但通常你会得到尽可能多的part-r-nnnnn文件,因为你有减速器任务。如果单词计数示例只配置了一个reducer,您所要做的就是配置多个(mapred.reduce.tasks或Hadoop 2等效)。
答案 2 :(得分:-1)
谢谢大家的上述建议。
我所拥有的MapReduce作业实际上只是一个简单的搜索工作,地图任务提取符合特定条件的输入行。然后简单地输出结果而不通过任何减少任务。
最初我没有设置减少任务数量,从输出日志我可以看到它默认为1.我试图设置更高的数字但不知何故它确实产生多个输出文件(part-000xx)但只有一个输出文件将包含所有结果,而其余文件只是空文件。
然后当我在下面设置时,它有效。每个reduce任务输出都是最终输出文件。我不确定这是否是正确的方法,但我现在将其视为一种解决方法
conf.set(“mapred.reduce.tasks”,“0”)