java—在mapreduce中的mapper/reducer类外部访问静态hashmap

pod7payv  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(428)

我试图编写一个mapreduce程序,其中map函数向hashmap添加项,然后reducer访问这些项并将其写入输出。

public class MyClass {
    static HashMap<String, Integer> temp = new HashMap<String, Integer>();

    public static class Map1 extends Mapper<LongWritable, Text, Text, IntWritable> {
        public void map(LongWritable key, Text value, Context context) {
            temp.put("1", 1);
        }
    }

    public static class Reduce1 extends Reducer<Text, IntWritable, Text, Text> {

        @Override
        public void reduce(Text key, Iterable<IntWritable> values, Context context) {
            Iterator it = temp.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry<String, Integer> pair = (Map.Entry<String, Integer>)it.next();
                String key = pair.getKey();
                String val = Integer.toString(pair.getValue());
                context.write(new Text(key), new Text(val));
            }
        }
    }

这可以很好地编译,但是reducer的输出是空的。我对java不是很在行,所以我不太确定这里出了什么问题。

vzgqcmou

vzgqcmou1#

您误解了mapreduce是一种分布式算法,它在许多进程和潜在的机器之间运行。
每一个新的 MyClass 在该过程中创建的示例将为空,并且不会作为应用程序生命周期的一部分共享
另外,你的Map绘制者什么也没做。将数据发送到reducer的方法是 context.write .
有关wordcount代码,请参阅官方hadoop文档。

相关问题