multipleoutputs不写文件,我做错什么了?

zyfwsgd6  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(349)

我基本上是想把我自己的一行制表符分隔的值写到3个不同的输出文件中。尽管定义和引用了不同的命名输出,但所有文件仍命名为“part-r-*”
所有代码都被匿名化和压缩
驱动程序类如下所示:

// Set up job
Job job = new Job(conf, MyDriver.class.getSimpleName());

job.setJarByClass(MyJar.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);

// Set mappers and reducers
job.setMapperClass(MyMapper.class);
job.setReducerClass(MyReducer.class);

job.setInputFormatClass(TextInputFormat.class);

FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]);

// Set the 3 different outputs
MultipleOutputs.addNamedOutput(job, "out1", TextOutputFormat.class,
         Text.class, Text.class);
MultipleOutputs.addNamedOutput(job, "out2", TextOutputFormat.class,
        Text.class, Text.class);
MultipleOutputs.addNamedOutput(job, "errors", TextOutputFormat.class,
        Text.class, Text.class);

// Run
System.exit(job.waitForCompletion(true) ? 0 : 1);

reducer在setup()方法中设置多路输出:

public void setup(Context context) {
    // Set up multiple output files
    multiOut = new MultipleOutputs<Text,Text>(context);
}

稍后从3个单独的方法调用,每个方法都与不同的输出有关,例如,错误最简单:

private void writeError(String error) {
    System.out.println("Writing: " + error);
    multiOut.write("errors", new Text(error), new Text());
}

问题是,我可以看到日志中有来自system.out.println的正确输出,但实际上没有任何内容写入文件。我甚至在清理中调用multiout.close()。
我想我只是在驾驶课上漏了点什么?如果我需要提供任何额外的数据,请告诉我。
如果值得一提的话,这是在amazonemr/s3上运行的,但我不认为这是问题所在。

ubof19bj

ubof19bj1#

请尝试以下语句:
multipleoutputs.addnamedoutput(作业,“out1”,textoutputformat.class,nullwritable.class,text.class);

rdlzhqv9

rdlzhqv92#

这并不是我想要的答案,但它确实有效。正如@davisbroda所建议的,我修改了代码以使用 write 方法指定基本输出。不管出于什么原因,我使用的名称在输出中根本没有得到利用,但至少我可以指定不同的输出文件夹,这样我就可以使用足够的分隔。
从上面的例子来看:

private void writeError(String error) {
    System.out.println("Writing: " + error);
    multiOut.write("errors", new Text(error), new Text(), basePath + "/errors/");
}

相关问题