[MapReduce] Counter
Definition
Counter
Counter是hadoop mapreduce framework所提供的一個工具,用來追蹤mapreduce job的進度。
 Counter表示全局的計數器,由MapReduce framework或者Application定義。每一個Counter有一個與之相關聯的name和long類型的value。Counter通過Enum類來定義,Enum類定義一個CounterGroup, 每個field頂一個一個Counter的name.
CounterGroup
CounterGroup是由邏輯上屬于一個group的所有的Counter所組成。一個CounterGroup對應一個枚舉類,每一個Counter對應枚舉類里面的一個枚舉值。下面這段代碼是Counter和CounterGroup的一個例子,在這個例子中,FileSystemCounter是一個枚舉類,對應于FileSystemCounter這個CounterGroup,這個CounterGroup里面包含多個Counter,BYTES_READ是其中一個Counter。
public enum FileSystemCounter {BYTES_READ,BYTES_WRITTEN,READ_OPS,LARGE_READ_OPS,WRITE_OPS,BYTES_READ_EC, }Usage
Counter主要用來記錄事件發生的次數。Hadoop mapreduce counter會追蹤如下事件:
- job里面包含的map/reduce任務數量
- job read/write多少個字節
- map/reduce launched/failed/killed count
- cpu/memory usage of job
Counter types
 總體上來講,Counter分為built-in counter和customized counter兩大類,built-in counter是mapreduce framework定義的counter,customized counter是用戶在mapreduce application中自己定義的counter,下面我們以此介紹這些counter。
Built-in Counter
Built-in counter也就是hadoop mapreduce framework為每一個job定義的counter,用來上報和job相關的統計信息。舉個例子,可以使用built-in counter來記錄讀/寫了多個少字節,讀/寫了多少記錄,通過這些統計信息我們可以確認,預期數量的輸入被處理了,預期數量的輸出被生產了。
TaskCounter
TaskCounter可以用來追蹤每個task進度,是由每個TaskAttempt維護,會周期性的把counter發送給ApplicationMaster,然后在全局范圍類做聚合。如下所示,我們會對比較重要的Counter的含義通過注釋進行說明。
public enum TaskCounter {MAP_INPUT_RECORDS,MAP_OUTPUT_RECORDS,MAP_SKIPPED_RECORDS,MAP_OUTPUT_BYTES,MAP_OUTPUT_MATERIALIZED_BYTES,SPLIT_RAW_BYTES,COMBINE_INPUT_RECORDS,COMBINE_OUTPUT_RECORDS,REDUCE_INPUT_GROUPS,REDUCE_SHUFFLE_BYTES,REDUCE_INPUT_RECORDS,REDUCE_OUTPUT_RECORDS,REDUCE_SKIPPED_GROUPS,REDUCE_SKIPPED_RECORDS,SPILLED_RECORDS,SHUFFLED_MAPS, FAILED_SHUFFLE,MERGED_MAP_OUTPUTS,GC_TIME_MILLIS,CPU_MILLISECONDS,PHYSICAL_MEMORY_BYTES,VIRTUAL_MEMORY_BYTES,COMMITTED_HEAP_BYTES,MAP_PHYSICAL_MEMORY_BYTES_MAX,MAP_VIRTUAL_MEMORY_BYTES_MAX,REDUCE_PHYSICAL_MEMORY_BYTES_MAX,REDUCE_VIRTUAL_MEMORY_BYTES_MAX; }| MAP_INPUT_RECORDS | 記錄每個map task處理得input record的個數,在RecordReader從InputSplit讀取record并且傳遞給mapper的map方法的時候會增加 | 
| MAP_OUTPUT_RECORDS | 記錄每個map task產生的output record的個數,在調用Mapper.Context類的write方法時會增加 | 
| REDUCE_INPUT_GROUPS | 記錄每個reduce task處理的key group的個數,在調用reduce方法的時候會增加 | 
| REDUCE_INPUT_RECORDS | 記錄每個reduce task處理的input record的個數,在通過Iterator對value進行迭代的過程中,沒讀取一個value,計數器數量會增加。如果reduce task處理了所有的input records,那么這個數量應該和MAP_OUTPUT_RECORDS相同 | 
| REDUCE_OUTPUT_RECORDS | 記錄每個reduce task產生的output record的個數,在調用Reducer.Context類的write方法時會增加 | 
| SPILLED_RECORDS | 記錄每個map/reduce task溢出記錄的個數 | 
| CPU_MILLISECONDS | 記錄每個map/reduce task累計的cpu使用時間,來自/proc/cpuinfo | 
| PHYSICAL_MEMORY_BYTES | 記錄每個map/reduce task累計使用的物理內存,來自/proc/meminfo | 
| VIRTUAL_MEMORY_BYTES | 記錄每個map/reduce task累計使用的虛擬內存,來自/proc/meminfo | 
JobCounter
JobCounter可以追蹤job的進度,JobCounter由ApplicationMaster來維護,所以這種類型的Counter不需要跨網絡傳輸,然而其它所有類型的Counter,包括用戶自定義的Counter都需要跨網絡傳輸。
public enum JobCounter {NUM_FAILED_MAPS, NUM_FAILED_REDUCES,NUM_KILLED_MAPS,NUM_KILLED_REDUCES,TOTAL_LAUNCHED_MAPS,TOTAL_LAUNCHED_REDUCES,OTHER_LOCAL_MAPS,DATA_LOCAL_MAPS,RACK_LOCAL_MAPS,@DeprecatedSLOTS_MILLIS_MAPS,@DeprecatedSLOTS_MILLIS_REDUCES,@DeprecatedFALLOW_SLOTS_MILLIS_MAPS,@DeprecatedFALLOW_SLOTS_MILLIS_REDUCES,TOTAL_LAUNCHED_UBERTASKS,NUM_UBER_SUBMAPS,NUM_UBER_SUBREDUCES,NUM_FAILED_UBERTASKS,TASKS_REQ_PREEMPT,CHECKPOINTS,CHECKPOINT_BYTES,CHECKPOINT_TIME,MILLIS_MAPS,MILLIS_REDUCES,VCORES_MILLIS_MAPS,VCORES_MILLIS_REDUCES,MB_MILLIS_MAPS,MB_MILLIS_REDUCES }| TOTAL_LAUNCHED_MAPS | 記錄每個job總共啟動的map task的數量 | 
| TOTAL_LAUNCHED_REDUCES | 記錄每個job總共啟動的reduce task的數量 | 
| NUM_UBER_SUBMAPS | 記錄每個uber job總共包括的map task的數量 | 
| NUM_UBER_SUBREDUCES | 記錄每個uber job總共包括的reduce task的數量 | 
| NUM_FAILED_MAPS | 記錄每個job總共失敗的map task的數量 | 
| NUM_FAILED_REDUCES | 記錄每個job總共失敗的reduce task的數量 | 
| NUM_KILLED_MAPS | 記錄每個job總共殺死的map task的數量 | 
| NUM_KILLED_REDUCES | 記錄每個job總共殺死的reduce task的數量 | 
| DATA_LOCAL_MAPS | 記錄每個job里面map task和input data在同一個節點的map task的數量 | 
| RACK_LOCAL_MAPS | 記錄每個job里面map task和input data在同一個rack但不在同一個node的map task的數量 | 
| OTHER_LOCAL_MAPS | 記錄每個job里面map task和input data不在同一個rack的map task的數量。不同rack之間的網絡帶寬是很稀缺的資源,hadoop盡可能的把map task放在input data的附近node上執行,所以這個值應該很小 | 
FileSystemCounter
File system countres track 2 main details , number of bytes read by the file system and number of bytes written.
public enum FileSystemCounter {BYTES_READ,BYTES_WRITTEN,READ_OPS,LARGE_READ_OPS,WRITE_OPS,BYTES_READ_EC, }| BYTES_READ | 每個map/reduce task在不同的文件系統上讀的字節數 | 
| BYTES_WRITTEN | 每個map/reduce task在不同的文件系統上寫的字節數 | 
FileInputFormatCounter
public enum FileInputFormatCounter {BYTES_READ }| BYTES_READ | 記錄每個map task讀取得字節數,在RecordReader從InputSplit讀取record并且傳遞給mapper的map方法的時候會增加 | 
FileOutputFormatCounter
public enum FileOutputFormatCounter {BYTES_WRITTEN }| BYTES_WRITTEN | 記錄每個reduce task(mapreduce job)或者map task(map only job)產生的字節數 | 
Customized Counter
除了built-in的Counter之外,在mapreduce程序里面,可以定義自定義Counter,收集一些我們所關心的metrics。
Static Counter
一個mapreduce job可以定義任意數量的枚舉類,每個枚舉類可以定義任務數量的的枚舉常量,每個枚舉類對應一個CounterGroup,每個枚舉常量對應一個Counter。
 定義一個Counter一般分為兩個步驟,第一步,定義枚舉類和枚舉常量;第二部,在Mapper/Reducer里面使用Counter
Dynamic Counter
通過定義枚舉類和枚舉常量的方式定義Counter,必須在程序運行之前把枚舉類和枚舉常量定義好,如果希望不事先定義枚舉類和枚舉常量,在程序運行的時候定義Counter,mapreduce framework也是支持的。只需要在獲取Counter的時候,顯示的指定CounterGroup名字和Counter名字,具體來說,通過下面這個方法事先。
interface TaskAttemptContext {public Counter getCounter(String groupName, String counterName); }Reference
- https://data-flair.training/blogs/hadoop-counters/
- https://acadgild.com/blog/counters-in-mapreduce
總結
以上是生活随笔為你收集整理的[MapReduce] Counter的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 接触名词汇总
- 下一篇: mysql基于amoeba读写分离
