2014-02-05 44 views
1

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

我遇到了MultipleOutputFormat类,但从我读过的内容看来,它只是将输出分解为基于键的文件。 MultipleOutputFormat

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

回答

1

原谅我,但通常你会得到尽可能多的part-r-nnnnn文件,因为你有减速器任务。如果字数统计示例只配置了一个reducer,则您只需配置多个(mapred.reduce.tasks或Hadoop 2等效项)即可。

+0

谢谢。我意识到,我一直将reducer任务作为默认值而没有设置值,所以它一直是1。 – Koh

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)

+0

hi @TomSebastian。感谢您的帮助。实际上,我的MapReduce作业是一个简单的搜索工作,因此它只运行没有reduce任务的地图任务,我只是希望它将所有搜索结果输出到多个输出文件。尽管如此,谢谢你的信息。可能会提供使用,因为我继续构建程序 – Koh

-1

谢谢大家对上述建议。

我所拥有的MapReduce作业实际上只是一个简单的搜索任务,地图任务会提取符合特定条件的输入行。然后简单地输出结果而不需要通过任何减少任务。

最初我没有设置减少任务数量,并从输出日志我可以看到它默认为1.我试图设置一个更高的数字,但它不会产生多个输出文件(部分000xx),但只有其中一个输出文件将包含所有结果,而其余的只是空文件。

然后,当我在下面设置它,它的工作。每个减少任务输出都是最终的输出文件。我真的不知道这是做了正确的方式,但我会把它现在作为一种解决方法

conf.set(“mapred.reduce.tasks”,“0”)