【问题标题】:Hadoop and re-used mutable writable fieldsHadoop 和重用的可变可写字段
【发布时间】:2020-03-03 09:35:42
【问题描述】:

这是一个从 Apache 教程发布的字数统计作业实现的 sn-p

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()) {
            word.set(itr.nextToken());
            context.write(word, one);
        }
    }
}

重用Text word 字段有什么好处吗?

我已经在许多 Hadoop 程序中看到了这种做法,这个类的实例化如此繁重以至于重用会导致性能提升。如果不是,人们为什么要这样做,而不是像context.write(new Text(itr.nextToken()), one);

【问题讨论】:

  • 相对于什么?
  • @PM77-1 重复使用 word 字段,而不是根据需要实例化 Text 对象
  • 明确DRY原则。
  • @PM77-1 怎么样?没有重复。
  • 也许这个问题在某种程度上也能帮助到你,stackoverflow.com/questions/26208454/…

标签: java performance hadoop


【解决方案1】:

你是对的,Text 对象的实例化并不重。但是,如果您正在处理数十亿条记录,那么您希望每条记录都减少可能的纳秒。每次您创建一个新的Text 对象时,Java 都必须为其分配内存、跟踪它,然后在某个时候对其进行垃圾回收。这一次真的可以加起来做大工作。

【讨论】:

  • 我认为这种微优化只会增加实现的复杂性。大多数刚接触 Java / Hadoop 的人可能不明白您没有必须这样做,而是将它捡起来 - 就像其他代码异味一样 - 并将其整合到其他任何地方。
  • 最干净的代码并不总是性能最好的。我认为 Java 新手不应该编写 MapReduce,但是官方文档可以有评论解释为什么他们重​​用 Text
猜你喜欢
  • 2018-09-07
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
相关资源
最近更新 更多