1. 程式人生 > >執行一個MapReduce時,應該監控些什麼

執行一個MapReduce時,應該監控些什麼

    執行一個MapReduce時,應該監控些什麼

前言

       本文討論的是,在以Yarn做資源管理的叢集上如何監控一個MapReduce程式。

一、概述

    當我們執行一個MapReduceJob,或是執行一個Hive SQL(MapReduce為引擎),又或是Sqoop後,程式被提交給了叢集。對於開發、測試叢集執行程式的開發人員來說,剛剛接觸MapReduce的初學者往往是在命令列前等著程式執行完成,遇到執行緩慢、出現報錯很難做出有效的響應。本文希望通過對Yarn原生UI等監控手段的介紹,能使讀者對MapReduce進行有效監控。

二、在哪監控

1.  Cloudera Manager的Yarn->應用程式

    如果使用CDH叢集,我們可以在登陸ClouderaManager(以下簡稱CM)後,在Yarn的應用程式中看到近一段時間執行的程式的摘要,其中包括了起止時間、持續時間、狀態等資訊,右側額下拉框可以非常方便的停止一個正在執行的程式。但這裡只有一些概述,缺少明細,如每個map執行的情況等,我們可以點選藍色的applicationID,頁面就會跳轉到Yarn的原生介面中。

2.  Yarn UI

    我們推薦在Yarn的原生的Web UI中監控程式。

    入口除了上例中提到的通過應用程式的applicationID跳轉外,也可以在Yarn->Web UI進入,其中ResourceManager(以下簡稱RM) WebUI中包括了近期全部程式的執行情況,HistoryServer(以下簡稱HS) WebUI中僅包含執行完成的(不包含被Kill掉的),並且在RM中檢視已經完成的程式明細時也需跳轉到HS中。關於能檢視多長時間的程式明細,與Yarn的RM、NodeManager(以下簡稱NM)等日誌留存情況有關。

    當然最方便的是記下RM的IP和埠號8088,或者放在瀏覽器收藏夾裡。

       由於原生UI各頁面地址通常都是hostname+埠,所以為了流暢的訪問,請在本地修改hosts增加叢集各個節點的地址,或者去改DNS伺服器。如果無法修改就得在訪問時去瀏覽器上改地址了。

3.  Oozie和Hue

    如果是用Oozie調起的程式,可以在Oozie 的WebUI或者Hue上看到任務的起止時間等概述資訊,此處不詳述。

三、          監控什麼

    通常監控的內容包括程式的執行開始結束時間、狀態、資源佔用情況、日誌、報錯資訊等,另外對於一些程式中的其他元件,如程式讀寫Hbase的情況下,也要監控其他元件的情況。

    因為Yarn WebUI上的監控資訊非常全面,CM上任務的摘要資訊也是來源於此,因此我們建議在需要監控程式執行時一直跟著這個頁面。如下內容以Yarn 的WebUI為例,說說監控通常有哪些內容。

 

1.  Yarn WebUI整體

1.1  RM

l  左側導航欄

-Cluster

——About:RM狀態版本等資訊

——Nodes:NM列表及狀態和屬性

——Applications:任務列表及狀態和屬性(常用,迷路了就點這個吧! )

————NEW、NEW_SAVING……:篩選不同狀態任務

——Scheduler:資源佇列列表和狀態

-Tools

——Configuration:yarn配置

——Local logs:本地日誌

——Server stacks:堆疊

——Server metrics:指標

l  上方指標區

叢集指標、叢集節點指標、使用者指標

l  任務列表

Ø  右上角搜尋框(常用,任務找不到在這兒搜尋! )

Ø  起止時間、狀態、進度、任務名、資源使用等等,

Ø  Tracking UI是進一步監控的入口(常用)

    正在執行的任務顯示ApplicationMaster,已經完成的顯示History

1.2  HS

    這裡只有執行完的,Kill掉的都可能不會有,介面類似RS就不詳述了,補充一點:

    最下方的這些搜尋框可以做篩選用

2.  MapReduce Job介面

    點了ApplicationMaster之後進入一個job的介面,mapreduce、spark會進入不同的介面,本文只討論MapReduce。


        再點選具體的Job ID,就來到了下圖這個介面。(常用,簡而言之就盯著這裡吧! )


l  Job的時間和狀態

    有開始時間(Started)和持續時間(Elapsed),狀態(State)。

l  ApplicationMaster資訊

l  Map和Reduce不同狀態下的個數統計

進度條(Progress)、合計(Total)、掛起(Pending)、執行中(Running)、完成(Complete)

Ø  如果map或reduce程序數太少,要考慮資料來源的特性或程式設定,例如以Hbase為資料來源時,Map的個數=源表region的個數。

Ø  Pending的原因,對於Map來說通常都是因為資源不足,對於reduce來說還可能是在等Map結束。

l  Map和Reduce不同狀態下的個數統計2

新增(New)、執行中(Running)、失敗(Failed)、殺死(Killed)、成功(Successful)

Ø  reduce會等map全部結束才真正開始

Ø  如果有失敗的,一定點進去看看!

Ø  Kill可能是某個map或reduce失敗超過重試次數後,其他的就會被kill掉

3.  Task介面

    點選這些帶下劃線的數字會進入到對應狀態的map或reduce task中,例如點選Maps的Failed列的數字進入到報錯的map列表中。

Ø  Attempt的末位編號是重試的次數,重試第3次之後如果還是失敗,這個MR就整體失敗了,所以當你認為報錯不會因重試就能解決的時候,直接去Kill掉你的程式,根據報錯資訊去排查問題吧,不要放在這裡浪費計算和儲存資源。

Ø  Node是執行這個map或reduce的NM,有助於判斷一些環境問題,例如報錯都集中在一個節點上,或者執行緩慢的都在這一個節點上,可能說明了資料傾斜、該節點資源不足、該節點有硬體問題等。

Ø  起止時間和持續時間,常用來尋找執行時間最長的任務。

Ø  Note中是報錯概要資訊

Ø  點選log去看更詳細的日誌

4.  日誌和報錯資訊

正在執行的和已經完成的任務分別在RM和HS上,點選log後會稍有差別,但都會顯示3種日誌stderr(報錯資訊)、stdout(標準輸出)、syslog(log4j日誌),

Ø  報錯資訊stderr

 

    上一步的Note中的報錯不夠具體,請一定點到這裡來看具體資訊!點選有下劃線的here可以展開。

Ø  stdout

    這裡有Map和Reduce中System.out.print的結果,但是可以少量列印除錯程式,但是請注意上線的程式不要留下System.out.print!這樣會拖慢程式,還可能會佔用大量儲存和IO資源!

Ø  syslog

    這裡有更加詳細的資訊供排查問題,比如對於讀取Hbase表的程式來說,會有表名、region的name,startRow和EndRow等。

5.  統計資訊

    點選左側導航欄中Job下的Counters,這裡有很多統計資訊,比較常用的是map和reduce的記錄數和大小。

6.  總結

    一句話總結,從Yarn WebUI或CM中查詢到你的Job,在Job的詳情頁中監控你的Job,如果有Failed進去看日誌,如果執行慢進去看日誌。