我正在使用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
我该怎么办?我是否正确使用了代码?
答案 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
,但它确实有效。希望有所帮助!