1. 程式人生 > >Hadoop學習筆記—7.計數器與自定義計數器

Hadoop學習筆記—7.計數器與自定義計數器

一、Hadoop中的計數器

計數器:計數器是用來記錄job的執行進度和狀態的。它的作用可以理解為日誌。我們通常可以在程式的某個位置插入計數器,用來記錄資料或者進度的變化情況,它比日誌更便利進行分析。

  例如,我們有一個檔案,其中包含如下內容:

hello you
hello me

  它被WordCount程式執行後顯示如下日誌:

  在上圖所示中,計數器有19個,分為四個組:File Output Format CountersFileSystemCountersFile Input Format CountersMap-Reduce Framkework

  分組File Input Format Counters包括一個計數器Bytes Read,表示job執行結束後輸出檔案的內容包括19個位元組(空格、換行都是字元),如下所示。

hello 2
me 1
you 1

  分組File Output Format Counters包括一個計數器Bytes Written,表示job執行時讀取的檔案內容包括19個位元組(空格、換行都是字元),如下所示。

hello you
hello me

  關於以上這段計數器日誌中詳細的說明請見下面的註釋:

 1    Counters: 19 // Counter表示計數器,19表示有19個計數器(下面一共4計數器組)
2 File Output Format Counters // 檔案輸出格式化計數器組 3 Bytes Written=19 // reduce輸出到hdfs的位元組數,一共19個位元組 4 FileSystemCounters// 檔案系統計數器組 5 FILE_BYTES_READ=481 6 HDFS_BYTES_READ=38 7 FILE_BYTES_WRITTEN=81316 8 HDFS_BYTES_WRITTEN=19 9 File Input Format Counters // 檔案輸入格式化計數器組
10 Bytes Read=19 // map從hdfs讀取的位元組數 11 Map-Reduce Framework // MapReduce框架 12 Map output materialized bytes=49 13 Map input records=2 // map讀入的記錄行數,讀取兩行記錄,”hello you”,”hello me” 14 Reduce shuffle bytes=0 // 規約分割槽的位元組數 15 Spilled Records=8 16 Map output bytes=35 17 Total committed heap usage (bytes)=266469376 18 SPLIT_RAW_BYTES=105 19 Combine input records=0 // 合併輸入的記錄數 20 Reduce input records=4 // reduce從map端接收的記錄行數 21 Reduce input groups=3 // reduce函式接收的key數量,即歸併後的k2數量 22 Combine output records=0 // 合併輸出的記錄數 23 Reduce output records=3 // reduce輸出的記錄行數。<helllo,{1,1}>,<you,{1}>,<me,{1}> 24 Map output records=4 // map輸出的記錄行數,輸出4行記錄

二、使用者自定義計數器

  以上是在Hadoop中系統內建的標準計數器。除此之外,由於不同的場景有不同的計數器應用需求,因此我們也可以自己定義計數器使用。

2.1 敏感詞記錄-準備

  現在假設我們需要對檔案中的敏感詞做一個統計,即對敏感詞在檔案中出現的次數做一個記錄。這裡,我們還是以下面這個檔案為例:

Hello World!
Hello Hadoop!

  文字內容很簡單,這裡我們指定Hello是一個敏感詞,顯而易見這裡出現了兩次Hello,即兩次敏感詞需要記錄下來。

2.2 敏感詞記錄-程式

  在WordCount程式的基礎之上,改寫Mapper類中的map方法,統計Hello出現的次數,如下程式碼所示:

        public static class MyMapper extends
            Mapper<LongWritable, Text, Text, LongWritable> {
        /*
         * @param KEYIN →k1 表示每一行的起始位置(偏移量offset)
         * 
         * @param VALUEIN →v1 表示每一行的文字內容
         * 
         * @param KEYOUT →k2 表示每一行中的每個單詞
         * 
         * @param VALUEOUT →v2表示每一行中的每個單詞的出現次數,固定值為1
         */
        protected void map(LongWritable key, Text value,
                Mapper<LongWritable, Text, Text, LongWritable>.Context context)
                throws java.io.IOException, InterruptedException {
            Counter sensitiveCounter = context.getCounter("Sensitive Words:", "Hello");
            
            String line = value.toString();
            // 這裡假定Hello是一個敏感詞
            if(line.contains("Hello")){
                sensitiveCounter.increment(1L);
            }
            String[] spilted = line.split(" ");
            for (String word : spilted) {
                context.write(new Text(word), new LongWritable(1L));
            }
        };
    }

  我們首先通過Mapper.Context類直接獲得計數器物件。這裡有兩個形參,第一個是計數器組的名稱,第二是計數器的名稱。

  然後通過String類的contains方法判斷是否存在Hello敏感詞。如果有,進入條件判斷語句塊,呼叫計數器物件的increment方法。

2.3 敏感詞記錄-結果

  通過檢視控制檯日誌資訊,可以看到如下圖所示的資訊:

  我們可以清楚地看到計數器由原來的19個變為20個,多出來的這個計數器正是我們自定義的敏感詞計數器,由於檔案中只有兩個Hello,因此這裡顯示Hello=2。

參考資料

作者:周旭龍

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。

相關推薦

Hadoop學習筆記—8.Combiner定義Combiner

一、Combiner的出現背景 1.1 回顧Map階段五大步驟   在第四篇博文《初識MapReduce》中,我們認識了MapReduce的八大步湊,其中在Map階段總共五個步驟,如下圖所示:   其中,step1.5是一個可選步驟,它就是我們今天需要了解的 Map規約 階段。現在,我們再來看看前一

Hadoop學習筆記—9.Partitioner定義Partitioner

一、初步探索Partitioner 1.1 再次回顧Map階段五大步驟   在第四篇博文《初識MapReduce》中,我們認識了MapReduce的八大步湊,其中在Map階段總共五個步驟,如下圖所示:   其中,step1.3就是一個分割槽操作。通過前面的學習我們知道Mapper最終處理的鍵值對&l

Hadoop學習筆記7.計數器定義計數器

一、Hadoop中的計數器 計數器:計數器是用來記錄job的執行進度和狀態的。它的作用可以理解為日誌。我們通常可以在程式的某個位置插入計數器,用來記錄資料或者進度的變化情況,它比日誌更便利進行分析。   例如,我們有一個檔案,其中包含如下內容: hello you hello me

Shader學習筆記(三)定義光照模型,經典光照模型LambertHalfLambert

自定義光照模型 #pragma surface surfaceFaction lightModel surfaceFaction:著色器程式碼的方法的名字 lightModel:光照模型的名稱 自

AngularJs學習筆記(4)——定義指令

ref 告訴 ack 生命周期 .com bsp ctrl 參數變量 ng- 對指令的第一印象:它是一個自定義標簽! 先來看一個簡單的指令: <!doctype html> <html ng-app="myApp"> <head>

Ehcache學習筆記(2)--定義ehcache工具類

二:自定義EhcacheUtils 1、CacheUtils package cn.kexq.commons.utils; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.eh

shiro學習筆記(3)--定義realm、授權

一:自定義Realm 1、繼承AuthorizingRealm(因為該類中有認證、授權的抽象方法,實現簡單) public class MyRealm1 extends AuthorizingRealm{ @Override public String getName(

Android學習筆記之為Dialog定義佈局,並說明空指標問題

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Vue:學習筆記(七)-定義指令

提醒 原帖完整收藏於IT老兵驛站,並會不斷更新。 前言 前面總結到了元件,對混入也進行了研究,不過感覺沒有啥需要總結的,就先總結指令吧,參考這裡,記錄筆記。 正文 簡介 全域性註冊 // 註冊一個全域性自定義指令 `v-focus` Vue.di

Zynq-Linux移植學習筆記之31-使用者定義I2C驅動

1、背景介紹 板子上通過ZYNQ的I2C-0控制器連線了三片DBF晶片和一片Ti的226測功耗晶片,示意圖如下: 如上圖所示,三塊DBF晶片的I2C地址分別為2,4,8,Ti 226晶片的I2C地址為0x40.現在需要ZYNQ通過I2C匯流排讀寫這四塊晶片的暫存器數值

springmvc學習筆記(26)——定義型別轉換器

資料繫結流程 使用springmvc框架有諸多好處,其中較為突出的就是它的資料繫結。 當我們的前端傳過來一個表單的時候,我們只需要使用一個類物件(如Student物件)就接收,springmvc將幫我們把屬性一一對應的填充進去。這就是資料繫結。 資料繫結過程中,springmvc幫我們把前端

springmvc學習筆記(28)——定義攔截器

1. 自定義攔截器 所謂的攔截器,就是用來攔截請求,因此我們可以對使用者發來的請求做處理。  寫一個類,實現攔截器的介面 import javax.servlet.http.HttpServletRequest; import javax.servlet.http.H

類的學習筆記(3)——定義裝飾器及裝飾器的理解

例一: 實現多加100 def fun1(x):      def fun2(y):           return x(y)+100       return fun2              #裝飾器 def ff(y):       return y*y   

react native學習筆記24——Modal實現定義彈出對話方塊

前言 上一篇文章介紹React Native系統提供的兩個彈出框的api——Alert與AlertIOS,Alert可以在雙平臺通用,但是隻能展示資訊量有限功能單一的文字對話方塊。AlertIOS比Alert稍微豐富一點,可以展示供使用者輸入的對話方塊,但只能

iPhone開發學習筆記005——使用XIB定義一個UIView,然後將這個view新增到controller的view

一、新建一個single view application型別的iOS application工程,名字取為CustomView,如下圖,我們不往CustomViewViewController.xib中新增任何控制元件:  二、新建一個CustomView.xib,過程如下:然後往介面上拖一個label和

Maven學習筆記(一)——定義maven變數以及maven內建常量

在建立Maven工程後,外掛配置中通常會用到一些Maven變數,因此需要找個地方對這些變數進行統一定義,下面介紹如何定義自定義變數。 在根節點project下增加properties節點,所有自定義變數均可以定義在此節點內,如下所示: <!-- 全域性屬性配置 --

torch學習筆記1:實現定義

當我們要實現自己的一些idea時,torch自帶的模組和函式已經不能滿足,我們需要自己實現層(或者類),一般的做法是把自定義層加入到已有的torch模組中。 實現 lua實現 如果自定義層的功能可以通過呼叫torch中已有的函式實現,那就只需要用l

Spring Boot學習筆記-錯誤處理及定義

正常的Web應用開發時,需要考慮到應用執行發生異常時或出現錯誤時如何來被處理,例如捕獲必要的異常資訊,記錄日誌方便日後排錯,友好的使用者響應輸出等等。 當然應用發生錯誤,有可能是應用自身的問題,也有可能是客戶端操作的問題。 Spring Boot預設提供了一種錯誤處理機制。 預設錯誤處理機制 預設情況下,S

Vue.js學習 Item13 – 指令系統定義指令

基礎 除了內建指令,Vue.js 也允許註冊自定義指令。自定義指令提供一種機制將資料的變化對映為 DOM 行為。 可以用 Vue.directive(id, definition) 方法註冊一個全域性自定義指令,它接收兩個引數指令 ID 與定義物件。也可以用

Latex學習筆記(六)——定義Latex模板

前言:         對於一個給定的模板,自己做了修改,用於日常工作寫報告使用(主要去除了封面和摘要部分),包含兩個檔案:(1) cls 檔案裡面定義好了常用的格式和環境;(2) tex 檔案裡面是我們文件內容的原始碼。當然,大家也可以根據自己的需要進行更改。 一、