为什么我们可以在WordCount示例中重用Text对象

时间:2018-07-06 22:57:17

标签: java hadoop mapreduce word-count

看到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);**
    }
}....

我的问题是,每个映射任务中是否只有一个Text对象,在通过使用“ word.set(...)”更改其内容之后,由于键使用相同的Text对象及其内容现在已更改。

我错过了什么吗?预先感谢您纠正我...

1 个答案:

答案 0 :(得分:0)

重用对象是避免创建许多新对象的良好实践。因此,context.write(word, one)方法中的map()填充并重新使用wordone对象。

context.write()将生成一个输出键/值对。 Hadoop框架将在调用context.write()时负责序列化数据。因此,您可以安全地重用map()方法中的对象。