Java Hadoop和重复使用的可变可写字段

Java Hadoop和重复使用的可变可写字段,java,performance,hadoop,Java,Performance,Hadoop,下面是Apache教程中发布的单词计数作业实现的一个片段 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 ke

下面是Apache教程中发布的单词计数作业实现的一个片段

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);
        }
    }
}
公共静态类TokenizerMapper扩展映射器{
私有最终静态IntWritable one=新的IntWritable(1);
私有文本字=新文本();
公共无效映射(对象键、文本值、上下文
)抛出IOException、InterruptedException{
StringTokenizer itr=新的StringTokenizer(value.toString());
而(itr.hasMoreTokens()){
set(itr.nextToken());
上下文。写(单词,一);
}
}
}
重复使用
文本单词
字段有什么好处吗


我在很多Hadoop程序中都看到过这种情况,这个类的实例化非常繁重,以至于重用可以提高性能。如果没有,为什么人们要这样做,而不是像
context.write(newtext(itr.nextToken()),one)

您是正确的,因为
文本
对象的实例化并不繁重。然而,如果你要处理数十亿条记录,那么你就需要在每条记录上尽可能地减少纳秒。每次创建一个新的
Text
对象时,Java都必须为它分配内存,跟踪它,然后在某个时候对它进行垃圾收集。这一次真的可以在大的工作中积累起来。

与什么相反?@PM77-1重复使用单词字段,而不是根据需要实例化文本对象Clear DRY principle。@PM77-1如何?没有重复。也许这个问题也能在某种程度上帮助你,我认为这种微观优化只会增加实现的复杂性。大多数刚接触Java/Hadoop的人可能不明白你不必这么做,但是像其他代码一样,把它捡起来,并在其他地方合并。最干净的代码并不总是性能最好的。我认为Java新手不应该编写MapReduce,但是官方文档可以有一条注释解释为什么他们重用
文本