据我所知,hadoop为每个输入拆分创建一个映射器任务,这些映射器任务应该彼此独立。但是,我发现实例变量可以在mapper任务之间以某种方式共享!
检查下面的代码是修改过的WordCount示例。如果变量IntWritable xyz是一个实例变量,我们应该在输出中看到每个单词后跟一个数字2.我的reducer除了写下键和值之外什么都不做:
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
private final IntWritable xyz = new IntWritable(1);
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
int x = xyz.get();
x++;
xyz.set(x);
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
//context.write(word, one);
context.write(word, xyz);
}
}
然而实际输出如下: A 4 Apache 2 Hadoop 2 横跨3 允许3 一个4 和7 申请4 集群3 计算5 电脑5 数据集3 设计6 分发3 每个7 环境4 框架工作4 框架2 从6开始 在4 是2 java 2 大3 当地7 机器6 模特3 5 提供7 打开2 处理3 编程3 提供5 规模6 服务器6 简单3 单身6 来源2 存储5 那3 数千6 到6 6点 使用3 作品4 写了2
所以我想也许只有一个Mapper实例?但是hadoop如何在具有不同JVM的多个节点上使用一个实例?