如何在Hadoop 0.20中使用MultipleoutputFormai



我正在使用Hadoop 0.20,我想有两个reduce输出文件而不是一个输出。我知道MultipleOutputFormat在Hadoop 0.20中不起作用。我在 Eclipse 中项目的构建路径中添加了 hadoop1.1.1 核 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();
        }
    }
}

并在运行中((:

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?我是否正确使用了代码?

你可以选择覆盖的MultipleTextOutputFormat扩展名,然后将记录的所有内容都作为"value"的一部分,同时使文件名或路径成为键。

有一个零工图书馆。它们具有一系列输出格式实现。你想要的是 MultipleLeafValueOutputFormat :写入键指定的文件,并且只写入值。

现在,假设您必须编写以下对,并且您的分隔符是制表符("\t"(:<"key1","value1">(您希望将其写入文件名 1(<"key2","value2">(您希望将其写入文件名 2(

因此,现在减速器的输出将转换为以下内容:<"文件名 1","键 1\t值 1"><"文件名2","键2\t值2">

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

conf.setOutputFormat(MultipleLeafValueOutputFormat.class);

这里要注意的一件事是,您将需要使用旧的mapred包而不是mapreduce包。但这应该不是问题。

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

遇到了同样的问题,我从运行命令中删除了-Dmapreduce.user.classpath.first=true并且它可以工作。 希望有帮助!

相关内容

  • 没有找到相关文章

最新更新