通過 JMX 獲取Hadoop/HBase監控數據
來源:程序員人生 發布時間:2015-04-23 07:47:12 閱讀次數:4957次
概述
說到對Hadoop和 HBase的集群監控,大家知道的和用的最多的可能還是第3方的監控工具,cacti,ganglia,zabbix之類的。玩的深1些的,會用 zenoss之類的。這些工具確切不錯,也能發揮很大的作用,但時間長了總感覺監控粒度還是比較粗,不夠詳細。畢竟是第3方的監控,即使Hadoop自帶 了ganglia的接口,也還是覺得不夠。
其實Hadoop本身是帶有監控接口的,各公司的發行版還有自己定制的接口,不過可能知道的人就不太多了。
其實這個接口特別簡單,但是非常詳細,也非常方便,就是JMX。
Hadoop的http監控端口基本所有人都知道,namenode 50070,jobtracker 50030,datanode 50075,tasktracker 50060。不過當用戶訪問這些端口的時候,會自動跳轉到dfshealth.jsp或jobtracker.jsp這樣的監控頁面。jmx的訪問很簡 單,只需要把網頁的名字換成jmx就能夠了。
例如
將
http://your_namenode:50070/dfshealth.jsp的地址替換成http://your_namenode:50070/jmx
便可,其他如50030,50060等等,也順次類推,HBase的系統信息也能夠用這類方法獲得。
返回值全部是JSON,非常便于自己進行處理。返回的信息也非常詳細,內存狀態,內存池狀態,java堆信息等等。乃至還有操作系統信息,版本,JVM版本信息等等,很全面。
實現
對http://your_namenode:50070/jmx 這樣地址的數據訪問可以通過HttpClient進行數據訪問,再將得到的數據通過
由于返回的Json數據量很大,而且基本上不可能全部需要,對這類情況可以通過添加?qry方式取得部份數據,
例如http://your_namenode:60010/jmx?qry=Hadoop:service=HBase,name=Master,sub=Server
Maven配置:
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20090211</version>
</dependency>
Java類
該程序以取得Hbase的監控數據為例,關于HDFS的監控數據相似
/**
* 作為HBase Master監控信息的source
*
* @author aihua.sun
* @date 2015/4/6
* @since V1.0
*/
import com.eric.agent.flume.model.HMasterRoleInfo;
import com.eric.agent.utils.AgentConstants;
import com.eric.agent.utils.MetricDataUtils;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HBaseMasterDataProvider{
protected final Logger LOGGER = LoggerFactory.getLogger(getClass());
private static final String server = "Hadoop:service=HBase,name=Master,sub=Server";
private static final String assignment = "Hadoop:service=HBase,name=Master,sub=AssignmentManger";
@Override
public String extractMonitorData() {
//TODO 通過調用API取得IP和參數
HMasterRoleInfo monitorDataPoint = new HMasterRoleInfo();
String URL = "http://hostname:60010/jmx";
JSONObject serverJson = qryJSonObjectFromJMX(URL, server);
JSONObject assignJson = qryJSonObjectFromJMX(URL, assignment);
try {
monitorDataPoint.setNumRegionServers(serverJson.getLong("numRegionServers"));
monitorDataPoint.setNumDeadRegionServers(serverJson.getLong("numDeadRegionServers"));
monitorDataPoint.setClusterRequests(serverJson.getLong("clusterRequests"));
monitorDataPoint.setRitCount(assignJson.getLong("ritCount"));
monitorDataPoint.setRitCountOverThreshold(assignJson.getLong("ritCountOverThreshold"));
monitorDataPoint.setRitOldestAge(assignJson.getLong("ritOldestAge"));
} catch (JSONException e) {
e.printStackTrace();
}
return monitorDataPoint.toString();
}
public static void main(String[] args){
System.out.println(new HBaseMasterDataProvider().extractMonitorData());
}
/**
* 通過jmx獲得監控數據
*
* @param URL
* @param objectName
* @return
*/
public static JSONObject qryJSonObjectFromJMX(String URL, String objectName) {
JSONObject jsonObject = null;
try {
StringBuilder sb = new StringBuilder(URL);
sb.append("?qry=");
sb.append(objectName);
GetMethod getMethod = new GetMethod(sb.toString());
int statusCode = httpClient.executeMethod(getMethod);
String jsonStr = new String(getMethod.getResponseBody());
jsonObject = new JSONObject(removeDuplicateContext(jsonStr)).getJSONArray("beans").getJSONObject(0);
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return jsonObject;
}
}
參考文章
JMXJsonServlet 介紹
http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/http/jmx/JMXJsonServlet.html
Hadoop指標介紹
http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-common/Metrics.html#rpc
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈