我正在使用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
并且它可以工作。 希望有帮助!