将MapReduce输出拆分为多个输出文件

时间:2014-02-05 07:26:08

标签: java hadoop mapreduce hdfs

是否可以将mapreduce作业的输出拆分为多个文件而不是单个'part-r-00000'文件?

我遇到过MultipleOutputFormat类,但是根据我的阅读,它似乎只是根据键将输出分解为文件。 MultipleOutputFormat

我正在寻找的是,以WordCount作为例子,将输出分成多个文件。

3 个答案:

答案 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”)

相关问题