如何在Hadoop 0.20中使用MultipleoutputFormai?

时间:2013-09-25 05:38:56

标签: java hadoop outputformat

我正在使用Hadoop 0.20,我希望有两个减少输出文件而不是一个输出。我知道MultipleOutputFormat在Hadoop 0.20中不起作用。我在Eclipse的项目构建路径中添加了hadoop1.1.1-core jar文件。但它仍然显示最后一个错误。

这是我的代码:

public static class ReduceStage extends Reducer<IntWritable, BitSetWritable, IntWritable, Text>
{
    private MultipleOutputs mos;
    public ReduceStage() {
        System.out.println("ReduceStage");
    }

    public void setup(Context context) {
        mos = new MultipleOutputs(context);
    }

    public void reduce(final IntWritable key, final Iterable<BitSetWritable> values, Context output ) throws IOException, InterruptedException
    {
        mos.write("text1", key, new Text("Hello")); 
    }

    public void cleanup(Context context) throws IOException {
        try {
            mos.close();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

在run()中:

FileOutputFormat.setOutputPath(job, ConnectedComponents_Nodes);
job.setOutputKeyClass(MultipleTextOutputFormat.class);
MultipleOutputs.addNamedOutput(job, "text1", TextOutputFormat.class,
                IntWritable.class, Text.class);

错误是:

java.lang.NoSuchMethodError: org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.setOutputName(Lorg/apache/hadoop/mapreduce/JobContext;Ljava/lang/String;)V
at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs.getRecordWriter(MultipleOutputs.java:409)
at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs.write(MultipleOutputs.java:370)
at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs.write(MultipleOutputs.java:348)
at bitsetmr$ReduceStage.reduce(bitsetmr.java:179)
at bitsetmr$ReduceStage.reduce(bitsetmr.java:1)
at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:176)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:566)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:408)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:216)

MultipleOutputFormat我该怎么办?我是否正确使用了代码?

2 个答案:

答案 0 :(得分:0)

您可以使用MultipleTextOutputFormat的重写扩展名,然后将记录的所有内容作为“值”的一部分,同时将文件名或路径作为键。

有一个oddjob库。它们具有一系列outputformat实现。你想要的是MultipleLeafValueOutputFormat:写入密钥指定的文件,只写入值。

现在,假设您必须编写以下对,并且您的分隔符是标签字符('\ t'): &LT; “KEY1”, “值1” &GT; (你希望这个用filename1写) &LT; “KEY2”, “值2” &GT; (您希望将其写入filename2)

所以,现在reducer的输出会变成如下: &LT; “文件名1”, “KEY1 \ tvalue1” &GT; &LT; “文件名2”, “KEY2 \ tvalue2” &GT;

另外,不要忘记上面定义的类应该作为outformat类添加到作业中:

conf.setOutputFormat(MultipleLeafValueOutputFormat.class);

此处需要注意的一点是,您需要使用旧的mapred包而不是mapreduce包。但那应该不是问题。

答案 1 :(得分:0)

首先,您应该确保FileOutputFormat.setOutputName在版本0.20和1.1.1之间具有相同的代码。如果没有,您必须具有兼容版本才能编译代码。如果相同,则命令中必定存在一些参数错误。

我遇到了同样的问题,我从运行命令中删除了-Dmapreduce.user.classpath.first=true,但它确实有效。希望有所帮助!