将tig mapreduce输出拆分为多个输出文件

bxjv4tth  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(355)

是否可以将mapreduce作业的输出拆分为多个文件,而不是单个“part-r-00000”文件?
我遇到过multipleoutputformat类,但从我所读到的内容来看,它似乎只会根据键将输出分解成文件。多路输出格式
我想要的是,以wordcount作业为例,将输出分成多个文件。

y4ekin9u

y4ekin9u1#

谢谢大家的建议。
我的mapreduce工作实际上只是一个简单的搜索工作,map任务提取符合特定条件的输入行。然后简单地输出结果,而不需要执行任何reduce任务。
最初我没有设置reduce tasks编号,从输出日志中我可以看到它默认为1。我试图设置一个更高的数字,但不知怎的,它确实产生了多个输出文件(第000xx部分),但只有一个输出文件将携带所有的结果,而其余的只是空文件。
当我把它放在下面的时候,它就起作用了。每个reduce任务的输出都是最终的输出文件。我不确定这是否是正确的方法,但我现在就把它作为一个解决办法
conf.set(“mapred.reduce.tasks”,“0”)

ffdz8vbo

ffdz8vbo2#

我在字数方面也有类似的问题。在我的情况下,我需要把每个字母开头的单词写进不同的文件中 MultipleOutputs .

  1. public class NameCountReducer extends Reducer<Text, NameCountTuple, Text, NameCountTuple> {
  2. private NameCountTuple result = null;
  3. private MultipleOutputs<Text,NameCountTuple> out;
  4. public void setup(Context context) {
  5. out = new MultipleOutputs<Text,NameCountTuple>(context);
  6. }
  7. public void reduce(Text key, Iterable<NameCountTuple> values, Context context)
  8. throws IOException, InterruptedException {
  9. int count = 0;
  10. for (HITuple val : values) {
  11. count += val.getCount();
  12. }
  13. result.setCount(count);
  14. out.write(key, result,"outputpath/"+key.getText().charAt(0));
  15. }
  16. public void cleanup(Context context) throws IOException,InterruptedException {
  17. out.close();
  18. }

}
在这里,它给出以下路径中的输出

  1. outputpath/a
  2. /b
  3. /c
  4. .......

为此,你应该使用 LazyOutputFormat.setOutputFormatClass() 而不是 FileOutputFormat . 还需要添加作业配置 job.setOutputFormatClass(NullOutputFormat.class)

展开查看全部
p3rjfoxz

p3rjfoxz3#

原谅我,但通常你会得到尽可能多的part-r-nnnnn文件。如果字数计算示例只配置了一个reducer,那么您所要做的就是配置多个reducer(mapred.reduce.tasks或hadoop2等效程序)。

相关问题