Java 如何在Hadoop 0.20中使用MultipleoutputFormai?
我正在使用Hadoop 0.20,我希望有两个reduce输出文件,而不是一个输出文件。我知道MultipleOutputFormat在Hadoop 0.20中不起作用。我在Eclipse项目的构建路径中添加了hadoop1.1.1-core jar文件。但它仍然显示了最后一个错误 这是我的密码: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>
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);