我试图编写一个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不是很在行,所以我不太确定这里出了什么问题。
1条答案
按热度按时间vzgqcmou1#
您误解了mapreduce是一种分布式算法,它在许多进程和潜在的机器之间运行。
每一个新的
MyClass
在该过程中创建的示例将为空,并且不会作为应用程序生命周期的一部分共享另外,你的Map绘制者什么也没做。将数据发送到reducer的方法是
context.write
.有关wordcount代码,请参阅官方hadoop文档。