Hadoop Text类设置方法

时间:2015-02-09 14:17:42

标签: java hadoop hadoop2

以下是来自Hadoop的WordCount示例的代码示例:

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的键。 outputKey实例是否在<key, value>对中共享?

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

1 个答案:

答案 0 :(得分:4)

这只是出于效率原因。

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

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