在Hadoop字数示例中,IntWritable是静态的,因此它可以在同一JVM中重用,而不是创建新的。我的问题是为什么不让文本也是静态的?我做到了,而且工作得很好,但从来没有在任何例子中看到过。我是不是错过了什么?
private ***static*** Text word = new Text();
private final static IntWritable intWritable = new IntWritable(1);
原始字数示例。
public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
output.collect(word, one);
}
}
OutputCollector API,收集Mapper和Reducer输出的对,为了程序正常工作,根据您的逻辑和试图解决的应用程序逻辑类型来决定变量是否必须是全局。在WordCount程序的情况下,程序工作正常,因为映射器对象没有在多个线程之间共享它的状态