MultipleOutputs没有写入文件,我做错了什么?

时间:2013-11-13 07:05:49

标签: hadoop mapreduce

我基本上试图将自己的Tab分隔值行写入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()方法中设置MultipleOutput:

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()。

我想我只是在驾驶课中遗漏了什么?如果我需要提供任何其他数据,请告诉我。

如果值得注意,这是在Amazon EMR / S3上运行,但我认为这不是问题。

2 个答案:

答案 0 :(得分:0)

这不是我认为我正在寻找的答案,但它确实有效。正如@DavisBroda建议的那样,我将代码更改为使用指定基本输出的write方法。无论出于何种原因,我使用的名称根本没有在输出中使用,但至少我可以指定不同的输出文件夹,这给了我足够的分离,我可以使用。

从上面的示例看起来像这样:

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

答案 1 :(得分:0)

请尝试以下声明:

MultipleOutputs.addNamedOutput(job,&#34; out1&#34;,TextOutputFormat.class,          NullWritable.class,Text.class);