Java 如何在Hadoop 0.20中使用MultipleoutputFormai?

Java 如何在Hadoop 0.20中使用MultipleoutputFormai?,java,hadoop,outputformat,Java,Hadoop,Outputformat,我正在使用Hadoop 0.20,我希望有两个reduce输出文件,而不是一个输出文件。我知道MultipleOutputFormat在Hadoop 0.20中不起作用。我在Eclipse项目的构建路径中添加了hadoop1.1.1-core jar文件。但它仍然显示了最后一个错误 这是我的密码: public static class ReduceStage extends Reducer<IntWritable, BitSetWritable, IntWritable, Text>

我正在使用Hadoop 0.20,我希望有两个reduce输出文件,而不是一个输出文件。我知道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();
        }
    }
}
错误是:

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”的一部分,同时将文件名或路径设置为键

有一个图书馆。他们有一系列outputformat实现。您需要的是multipleAfValueOutputFormat:写入键指定的文件,并且只写入值

现在,假设您必须编写以下对,分隔符是制表符“\t”: 您希望将其写入filename1 您希望将其写入filename2

因此,现在减速器的输出将转换为:

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

conf.setOutputFormat(MultipleLeafValueOutputFormat.class);

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

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


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

使用1.1.1但在0.20中运行的构建不起作用。实际上,将首先加载0.20,而1.1.1无法覆盖0.20。@zsxwing:那么我如何在hadoop 0.20中使用MultipleOutput格式呢?您需要将这些代码复制到您的项目中,或者升级hadoop。即使是我也遇到了这个问题,这是因为路径中有两个不同版本的JAR,我从path中排除了其他版本,并将其删除worked@aliabdoli我也面临同样的问题。我正在使用hadoop 0.20开发一个遗留系统。您是如何解决的?@Anar我想要两个seprate文件。是的,这将为您提供两个单独的文件,filename1和filename2!
conf.setOutputFormat(MultipleLeafValueOutputFormat.class);