Hadoop map reduce总是写入相同的值



我正在尝试运行一个简单的mapreduce程序,其中映射器为同一键写入两个不同的值,但是当我到达化简器时,它们总是相同的。

这是我的代码:

public class kaka {
public static class Mapper4 extends Mapper<Text, Text, Text, Text>{
    public void map(Text key, Text value, Context context) throws IOException, InterruptedException {
        context.write(new Text("a"),new Text("b"));
        context.write(new Text("a"),new Text("c"));
    }
}
public static class Reducer4 extends Reducer<Text,Text,Text,Text> {
    public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
        Vector<Text> vals = new Vector<Text>(); 
        for (Text val : values){
            vals.add(val);
        }
        return;
    }
}
public static void main(String[] args) throws Exception {
    //deleteDir(new File("eran"));//todo
    Configuration conf = new Configuration();
    conf.set("mapred.map.tasks","10"); // asking for more mappers (it's a recommendation)
    conf.set("mapred.max.split.size","1000000"); // set default size of input split. 1000 means 1000 bytes. 
    Job job1 = new Job(conf, "find most similar words");
    job1.setJarByClass(kaka.class);
    job1.setInputFormatClass(SequenceFileInputFormat.class);
    job1.setMapperClass(Mapper4.class);
    job1.setReducerClass(Reducer4.class);
    job1.setOutputFormatClass(SequenceFileOutputFormat.class);
    job1.setOutputKeyClass(Text.class);
    job1.setOutputValueClass(Text.class);
    FileInputFormat.addInputPath(job1, new Path("vectors/part-r-00000"));
    FileOutputFormat.setOutputPath(job1, new Path("result"));
    job1.waitForCompletion(true);
    System.exit(job1.waitForCompletion(true) ? 0 : 1);
}
}

在迭代化简器中的值时,你被 objext 重用所吸引。很久以前有一个 JIRA 补丁来提高效率,这意味着传递给映射器的键/值对象和传递给化简器的键/值对象始终是相同的底层对象引用,只是这些对象的内容随着每次迭代而变化。

在添加到向量之前,修改代码以复制该值:

public static class Reducer4 extends Reducer<Text,Text,Text,Text> {
    public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
        Vector<Text> vals = new Vector<Text>(); 
        for (Text val : values){
            // make copy of val before adding to the Vector
            vals.add(new Text(val));
        }
        return;
    }
}

相关内容

  • 没有找到相关文章

最新更新