【发布时间】:2018-07-07 23:35:30
【问题描述】:
看了Hadoop的例子:WordCount,我不明白为什么我们可以重用Text对象而不是为每个写操作“context.write(...)”创建一个新对象?
public class WordCount {
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
**private Text word = new Text();**
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
// set other String in Text object
**word.set(itr.nextToken());**
**context.write(word, one);**
}
}....
我的问题是,如果每个map任务中只有一个Text对象,在我们使用“word.set(...)”改变它的内容后,之前的结果键值对会受到影响,因为键使用相同的 Text 对象,其内容现在已更改。
我错过了什么吗?提前感谢您纠正我...
【问题讨论】:
-
您是否观察到之前的键受到影响?
-
@cricket_007no,这只是我脑海中的一个问题,我想知道为什么我们可以这样编码。
-
因为对象已经序列化并写入内存缓冲区。这些字节在写入后不会被操作,所以对象可以被重用
标签: java hadoop mapreduce word-count