Hadoop監控方法總結

2021-06-20 00:51:05 字數 2498 閱讀 2782

接觸hadoop已經一年半了,期間積累了一些hadoop運維經驗,一直想自己開發一套hadoop監控系統,正好最近實驗室有個相關的專案,就藉機研究了一下,在這裡總結一下hadoop監控辦法。

一直認為hadoop本身自帶的hdfs和jobtracker監控頁面是最好用的監控頁面,簡單明瞭。但是現在想要自己開發一套監控系統,那該怎樣去獲取hadoop集群的當前狀況呢?

網頁抓取

首先,想到的辦法是抓取網頁,通過抓取50030和50070頁面獲得監控的資料。不得不說,這個辦法實在是太土了,不到萬不得已真的不好意思用。

datanode的資訊:http://datanode:50075/jmx

tasktracker資訊:http://datanode:50060/jmx

上面這些鏈結基本上可以提供所有想要監控的資訊了,但是,找了一圈兒也沒找到我想要的job列表,包括正在執行的作業、成功的作業以及失敗的作業資訊。

hadoop api

這時想到了早期版本的hadoop api提交作業的時候都會用的jobclient這個類,抱著試試看的態度,去hadoop api裡面翻了半天,還真有收穫。

直接上乾貨了:

configuration conf = new configuration();

inetsocketaddress inetsocket = new inetsocketaddress(monitorutil.gethostnameofnamenode(), 9001);

jobclient jobclient = new jobclient(inetsocket, conf);

jobstatus jobsstatus = jobclient.getalljobs();

//這樣就得到了乙個jobstatus陣列,隨便取出乙個元素取名叫jobstatus

jobstatus = jobsstatus[0];

jobid jobid = jobstatus.getjobid(); //通過jobstatus獲取jobid

runningjob runningjob = jobclient.getjob(jobid); //通過jobid得到runningjob物件

runningjob.getjobstate();//可以獲取作業狀態,狀態有五種,為jobstatus.failed 、jobstatus.killed、jobstatus.prep、jobstatus.running、jobstatus.succeeded

jobstatus.getusername();//可以獲取執行作業的使用者名稱。

runningjob.getjobname();//可以獲取作業名。

jobstatus.getstarttime();//可以獲取作業的開始時間,為utc毫秒數。

runningjob.reduceprogress();//可以獲取reduce階段完成的比例。

runningjob.getfailureinfo();//可以獲取失敗資訊。

runningjob.getcounters();//可以獲取作業相關的計數器,計數器的內容和作業監控頁面上看到的計數器的值一樣。

計數器這塊稍微有點兒麻煩,舉個例子吧。想要獲得hdfs_bytes_read的值,方法為:
runningjob.getcounters().getgroup("filesystemcounters").getcounter("hdfs_bytes_read");
這裡的filesystemcounters為group的名稱,以該名稱作為getgrout的引數可以取得相應的group。group的名稱和50030頁面上看到的組的名稱並不相同,對應關係為:

org.apache.hadoop.mapred.jobinprogress$counter

job counters

org.apache.hadoop.mapreduce.lib.output.fileoutputformat$counter

file output format counters

filesystemcounters

filesystemcounters

org.apache.hadoop.mapreduce.lib.input.fileinputformat$counter

file input format counters

org.apache.hadoop.mapred.task$counter

map-reduce framework

左邊為getgroup函式引數名,後面為想要獲取的組名稱。

得到group之後就可以通過計數器的名稱來得到相應計數器的值了。

這裡可以提供的資訊已經很全面了,不過缺少了乙個作業執行時間,或者作業的結束時間。對於正在執行的作業倒是可以通過當前時間減去開始時間來獲得執行時間,但是結束時間目前還沒找到解決辦法。如果有知道的朋友,可以告訴我,感激不盡。

網上看到一篇部落格(提到cluster類提供了更豐富的api介面,這個應該是要求hadoop2.0以上的版本,由於不能公升級實驗室的hadoop所以就沒有測試。

使用Ganglia監控Hadoop

hadoop本身提供了很多監控工具的介面,如jmx nagios ganglia等。使用ganglia監控hadoop,配置起來非常簡單,只需要修改 hadoop home conf hadoop metrics.properties檔案,把相關的配置段修改為下面的示例 configuration ...

使用Ganglia監控Hadoop

hadoop本身提供了很多監控工具的介面,如jmx nagios ganglia等。使用ganglia監控hadoop,配置起來非常簡單,只需要修改 hadoop home conf hadoop metrics.properties檔案,把相關的配置段修改為下面的示例 configuration ...

使用ganglia監控hadoop

使用ganglia監控hadoop hadoop本身提供了很多監控工具的介面,如jmx nagios ganglia等。使用ganglia監控hadoop,配置起來非常簡單,只需要修改 hadoop home conf hadoop metrics.properties檔案,把相關的配置段修改為下面...