【问题标题】:Why can we reuse Text object in WordCount example为什么我们可以在 WordCount 示例中重用 Text 对象
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 您的意思是context.write() 会为键值对创建新对象以进行下一步处理吗?
  • 不,context.write() 将重用现有的 wordone 对象。 map() 方法将在每个输入记录中调用一次。现在,word 是类Text 的一个实例,它实现了WritableComparable,提高了序列化效率。此外,word.set(String newValue) 方法用于在每次调用 map() 方法时更新 word 的内容,从而允许在每次调用期间重复使用 word 对象。
猜你喜欢
  • 2015-04-20
  • 2011-01-27
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 2021-10-23
相关资源
最近更新 更多