2015-02-09 80 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對象的非靜態最終實例。地圖方法被調用,你可以清除或只設置單個文本實例,然後將其寫入映射器的上下文中,然後上下文將在再次調用地圖方法之前使用/複製數據,因此您不必擔心關於覆蓋框架使用的數據。「