天天看點

Hadoop初學指南(7)--MapReduce自定義計數器

本文主要介紹了MapReduce中的自定義計數器的相關内容。

在上次的單詞統計例子中,我們可以看到MapReduce在執行過程中會有很多的控制台輸出資訊,其中有一個很關鍵的内容:計數器。如下圖:

Hadoop初學指南(7)--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擷取計數器,然後根據需要記錄相關内容即可。

以下是執行過程中控制台輸出的内容:

繼續閱讀