經常會有一些Hadoop監控的需求,例如datanode節點掉線,Tasktracker blacklist的數量,以及Namenode,Jobtracker的內存GC信息等。
之前采用Hadoop API獲取這類信息插入Mysql,再用php腳本做邏輯判斷並發送報警。這種做法代價比較高,需要在每個集群部署一個java用以收集信息。
后來發現hadoop提供了一個JMX的json數據接口,可以比較方便的得到這些信息。只需在頁面上便可訪問到,例如namenode
只需要將http://namenode:50070/dfshealth.jsp換成http://namenode:50070/jmx即可,收集到的json信息類似這樣:
{ name: "java.lang:type=Memory", modelerType: "sun.management.MemoryImpl", Verbose: true, HeapMemoryUsage: { committed: 58680999936, init: 0, max: 58680999936, used: 36259957544 }, NonHeapMemoryUsage: { committed: 49778688, init: 24313856, max: 136314880, used: 32792624 }, ObjectPendingFinalizationCount: 0 },
包含namenode各種詳細的信息,包括內存相關,GC,活動的節點,空間使用等等。
由於信息比較多,也提供了一個qry=name的方式獲取具體某一項所需的數據,例如:
http://namenode:50070/jmx?qry=hadoop:service=NameNode,name=NameNodeInfo 只收集nameinfo相關的數據。
順便提供一下php解析這些數據的方法:
<?php
$domain="namenode.hadoop.domain";
#解析namenode info數據
$nameurl="http://".$domain.":50070/jmx?qry=hadoop:service=NameNode,name=NameNodeInfo";
#parser json data to array from nameurl
$namejson=(json_decode(file_get_contents($nameurl),true));
$namebeans=$namejson["beans"];
$NameInfo=$namebeans[0];
#parser nodes to array and count livenode,deadnode,decomnode.
$LiveNodes=(json_decode($NameInfo["LiveNodes"],true));
$LiveNodesCount=count($LiveNodes);
$DeadNodes=(json_decode($NameInfo["DeadNodes"],true));
$DeadNodesCount=count($DeadNodes);
$DecomNodes=(json_decode($NameInfo["DecomNodes"],true));
$DecomNodesCount=count($DecomNodes);
$HostName=$NameInfo["HostName"];
$Used=$NameInfo["Used"];
$Total=$NameInfo["Total"];
$PercentUsed=$NameInfo["PercentUsed"];
$TotalBlocks=$NameInfo["TotalBlocks"];
$TotalFiles=$NameInfo["TotalFiles"];
#解析jobtracker數據
$joburl="http://".$domain.":50030/jmx?qry=hadoop:service=JobTracker,name=JobTrackerInfo";
$jobjson=(json_decode(file_get_contents($joburl),true));
$jobbeans=$jobjson["beans"];
$JobInfo=$jobbeans[0];
$SummaryJson=(json_decode($JobInfo["SummaryJson"],true));
$nodes=$SummaryJson["nodes"];
$alive=$SummaryJson["alive"];
$blacklisted=$SummaryJson["blacklisted"];
$jobs=$SummaryJson["jobs"];
$slots=$SummaryJson["slots"];
$map_slots=$slots["map_slots"];
$map_slots_used=$slots["map_slots_used"];
$reduce_slots=$slots["reduce_slots"];
$reduce_slots_used=$slots["reduce_slots_used"];
?>
參考:http://slaytanic.blog.51cto.com/2057708/1179108
