2015-02-09 78 views
1

下面是从的Hadoop字计数示例代码示例:Hadoop的文本类设置方法

class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> { 
    private Text outputKey; 
    private IntWritable outputVal; 

    @Override 
    public void setup(Context context) { 
     outputKey = new Text(); 
     outputVal = new IntWritable(1); 
    } 

    @Override 
    public void map(Object key, Text value, Context context) throws IOException, InterruptedException { 
     StringTokenizer stk = new StringTokenizer(value.toString()); 
     while(stk.hasMoreTokens()) { 
      outputKey.set(stk.nextToken()); 
      context.write(outputKey, outputVal); 
     } 
    } 
} 

只有一个outputKey实例。在while循环中,outputKey设置不同的单词并被写为context的密钥。在整个<key, value>对内是否共享outputKey实例?

为什么不使用context.write(new Text(stk.nextToken()), new IntWritable(1))

回答

4

这只是出于效率的原因。

阅读本文:http://www.joeondata.com/2014/05/22/memory-management-in-hadoop-mapreduce/

“例如,如果您使用org.apache.hadoop.io.Text作为地图输出键,则可以在Mapper类中创建一个Text对象的非静态最终实例。地图方法被调用,你可以清除或只设置单个文本实例,然后将其写入映射器的上下文中,然后上下文将在再次调用地图方法之前使用/复制数据,因此您不必担心关于覆盖框架使用的数据。“