MapReduce Counter爲提供咱們一個窗口:觀察MapReduce job運行期的各類細節數據。今年三月份期間,我曾經專一於MapReduce性能調優工做,是否優化的絕大多評估都是基於這些Counter的數值表現。MapReduce自帶了許多默認Counter,可能有些朋友對它們有些疑問,如今我分析下這些默認Counter的含義,方便你們觀察job結果。
個人分析是基於Hadoop0.21,我也看過Hadoop其它版本的Counter展示,細節大同小異,若是有差別的地方,以事實版本爲主。
Counter有"組group"的概念,用於表示邏輯上相同範圍的全部數值。MapReduce job提供的默認Counter分爲五個組,下面逐一介紹。這裏也拿個人一份測試數據來作詳細比對,它們會以表格的形式出如今各組描述中。
FileInputFormatCounters
這個group表示map task讀取文件內容(總輸入數據)的統計
網絡
Counter | Map | Reduce | Total | |
FileInputFormatCounters | BYTES_READ | 1,109,990,596 | 0 | 1,109,990,596 |
BYTES_READ
Map task的全部輸入數據(字節),等於各個map task的map方法傳入的全部value值字節之和。
FileSystemCounters
MapReduce job執行所依賴的數據來自於不一樣的文件系統,這個group表示job與文件系統交互的讀寫統計
框架
Counter | Map | Reduce | Total | |
FileSystemCounters | FILE_BYTES_READ | 0 | 1,544,520,838 | 1,544,520,838 |
FILE_BYTES_WRITTEN | 1,544,537,310 | 1,544,520,838 | 3,089,058,148 | |
HDFS_BYTES_READ | 1,110,269,508 | 0 | 1,110,269,508 | |
HDFS_BYTES_WRITTEN | 0 | 827,982,518 | 827,982,518 |
FILE_BYTES_READ
job讀取本地文件系統的文件字節數。假定咱們當前map的輸入數據都來自於HDFS,那麼在map階段,這個數據應該是0。但reduce在執行前,它的輸入數據是通過shuffle的merge後存儲在reduce端本地磁盤中,因此這個數據就是全部reduce的總輸入字節數。
FILE_BYTES_WRITTEN
map的中間結果都會spill到本地磁盤中,在map執行完後,造成最終的spill文件。因此map端這裏的數據就表示map task往本地磁盤中總共寫了多少字節。與map端相對應的是,reduce端在shuffle時,會不斷地拉取map端的中間結果,而後作merge並不斷spill到本身的本地磁盤中。最終造成一個單獨文件,這個文件就是reduce的輸入文件。
HDFS_BYTES_READ
整個job執行過程當中,只有map端運行時,才從HDFS讀取數據,這些數據不限於源文件內容,還包括全部map的split元數據。因此這個值應該比FileInputFormatCounters.BYTES_READ 要略大些。
HDFS_BYTES_WRITTEN
Reduce的最終結果都會寫入HDFS,就是一個job執行結果的總量。
Shuffle Errors
這組內描述Shuffle過程當中的各類錯誤狀況發生次數,基本定位於Shuffle階段copy線程抓取map端中間數據時的各類錯誤。 oop
Counter | Map | Reduce | Total | |
Shuffle Errors | BAD_ID | 0 | 0 | 0 |
CONNECTION | 0 | 0 | 0 | |
IO_ERROR | 0 | 0 | 0 | |
WRONG_LENGTH | 0 | 0 | 0 | |
WRONG_MAP | 0 | 0 | 0 | |
WRONG_REDUCE | 0 | 0 | 0 |
BAD_ID
每一個map都有一個ID,如attempt_201109020150_0254_m_000000_0,若是reduce的copy線程抓取過來的元數據中這個ID不是標準格式,那麼此Counter增長 性能
CONNECTION
表示copy線程創建到map端的鏈接有誤
IO_ERROR
Reduce的copy線程若是在抓取map端數據時出現IOException,那麼這個值相應增長
WRONG_LENGTH
map端的那個中間結果是有壓縮好的有格式數據,全部它有兩個length信息:源數據大小與壓縮後數據大小。若是這兩個length信息傳輸的有誤(負值),那麼此Counter增長
WRONG_MAP
每一個copy線程固然是有目的:爲某個reduce抓取某些map的中間結果,若是當前抓取的map數據不是copy線程以前定義好的map,那麼就表示把數據拉錯了
WRONG_REDUCE
與上面描述一致,若是抓取的數據表示它不是爲此reduce而準備的,那仍是拉錯數據了。
Job Counters
這個group描述與job調度相關的統計 測試
Counter | Map | Reduce | Total | |
Job Counters | Data-local map tasks | 0 | 0 | 67 |
FALLOW_SLOTS_MILLIS_MAPS | 0 | 0 | 0 | |
FALLOW_SLOTS_MILLIS_REDUCES | 0 | 0 | 0 | |
SLOTS_MILLIS_MAPS | 0 | 0 | 1,210,936 | |
SLOTS_MILLIS_REDUCES | 0 | 0 | 1,628,224 | |
Launched map tasks | 0 | 0 | 67 | |
Launched reduce tasks | 0 | 0 | 8 |
Data-local map tasks
Job在被調度時,若是啓動了一個data-local(源文件的幅本在執行map task的taskTracker本地)
FALLOW_SLOTS_MILLIS_MAPS
當前job爲某些map task的執行保留了slot,總共保留的時間是多少
FALLOW_SLOTS_MILLIS_REDUCES
與上面相似
SLOTS_MILLIS_MAPS
全部map task佔用slot的總時間,包含執行時間和建立/銷燬子JVM的時間
SLOTS_MILLIS_REDUCES
與上面相似
Launched map tasks
此job啓動了多少個map task
Launched reduce tasks
此job啓動了多少個reduce task
Map-Reduce Framework
這個Counter group包含了至關多地job執行細節數據。這裏須要有個概念認識是:通常狀況下,record就表示一行數據,而相對地byte表示這行數據的大小是多少,這裏的group表示通過reduce merge後像這樣的輸入形式{「aaa」, [5, 8, 2, …]}。 優化
Counter | Map | Reduce | Total | |
Map-Reduce Framework | Combine input records | 200,000,000 | 0 | 200,000,000 |
Combine output records | 117,838,546 | 0 | 117,838,546 | |
Failed Shuffles | 0 | 0 | 0 | |
GC time elapsed (ms) | 23,472 | 46,588 | 70,060 | |
Map input records | 10,000,000 | 0 | 10,000,000 | |
Map output bytes | 1,899,990,596 | 0 | 1,899,990,596 | |
Map output records | 200,000,000 | 0 | 200,000,000 | |
Merged Map outputs | 0 | 536 | 536 | |
Reduce input groups | 0 | 84,879,137 | 84,879,137 | |
Reduce input records | 0 | 117,838,546 | 117,838,546 | |
Reduce output records | 0 | 84,879,137 | 84,879,137 | |
Reduce shuffle bytes | 0 | 1,544,523,910 | 1,544,523,910 | |
Shuffled Maps | 0 | 536 | 536 | |
Spilled Records | 117,838,546 | 117,838,546 | 235,677,092 | |
SPLIT_RAW_BYTES | 8,576 | 0 | 8,576 |
Combine input records
Combiner是爲了減小盡可能減小須要拉取和移動的數據,因此combine輸入條數與map的輸出條數是一致的。
Combine output records
通過Combiner後,相同key的數據通過壓縮,在map端本身解決了不少重複數據,表示最終在map端中間文件中的全部條目數
Failed Shuffles
copy線程在抓取map端中間數據時,若是由於網絡鏈接異常或是IO異常,所引發的shuffle錯誤次數
GC time elapsed(ms)
經過JMX獲取到執行map與reduce的子JVM總共的GC時間消耗
Map input records
全部map task從HDFS讀取的文件總行數
Map output records
map task的直接輸出record是多少,就是在map方法中調用context.write的次數,也就是未通過Combine時的原生輸出條數
Map output bytes
Map的輸出結果key/value都會被序列化到內存緩衝區中,因此這裏的bytes指序列化後的最終字節之和
Merged Map outputs
記錄着shuffle過程當中總共經歷了多少次merge動做
Reduce input groups
Reduce總共讀取了多少個這樣的groups
Reduce input records
若是有Combiner的話,那麼這裏的數值就等於map端Combiner運算後的最後條數,若是沒有,那麼就應該等於map的輸出條數
Reduce output records
全部reduce執行後輸出的總條目數
Reduce shuffle bytes
Reduce端的copy線程總共從map端抓取了多少的中間數據,表示各個map task最終的中間文件總和
Shuffled Maps
每一個reduce幾乎都得從全部map端拉取數據,每一個copy線程拉取成功一個map的數據,那麼增1,因此它的總數基本等於 reduce number * map number
Spilled Records
spill過程在map和reduce端都會發生,這裏統計在總共從內存往磁盤中spill了多少條數據
SPLIT_RAW_BYTES
與map task 的split相關的數據都會保存於HDFS中,而在保存時元數據也相應地存儲着數據是以怎樣的壓縮方式放入的,它的具體類型是什麼,這些額外的數據是MapReduce框架加入的,與job無關,這裏記錄的大小就是表示額外信息的字節大小 線程
轉自:http://langyu.iteye.com/blog/1171091code