本文主要介紹了MapReduce中的自定義計數器的相關内容。
在上次的單詞統計例子中,我們可以看到MapReduce在執行過程中會有很多的控制台輸出資訊,其中有一個很關鍵的内容:計數器。如下圖:
可以看到最上方的關鍵字:Counters,這就表示計數器。
在這裡,隻有一個制表符縮進的表示計數器組,有兩個制表符縮進的表示計數器組下的計數器。如File Output Format Counters就表示檔案輸出的計數器組,裡面的Bytes Written表示輸出的字元數,在輸出的文本中,hello,you,me加起來是10個字元,2,1,1加起來是3個字元,中間在加上3個制表符,前兩行中有2個換行符,最後一行有一個結束符,總共19個,跟計數器的19相等。
同時在第4組中,我們可以看到Reduce input records是4,Map output records也是4,說明了Map的輸出就是Reduce的輸入。
那麼這些都是系統的計數器,如何自定義計數器呢?
例如,這裡我們要記錄一下hello出現的次數,隻需要在自己的Mapper中加上計數器的相關内容即可,代碼如下:
static class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable>{
protected void map(LongWritable k1, Text v1, Context context) throws java.io.IOException ,InterruptedException {
Counter helloCounter = context.getCounter("Sensitive Words", "hello");
String line = v1.toString();
if(line.contains("hello")){
helloCounter.increment(1L);
}
final String[] splited = line.split(" ");
for (String word : splited) {
context.write(new Text(word), new LongWritable(1));
}
};
}
對比原來的mapper,我們發現,隻需要通過context擷取計數器,然後根據需要記錄相關内容即可。
以下是執行過程中控制台輸出的内容: