背景:
公司自建IDC機(jī)房,基于IDC機(jī)房構(gòu)建大數(shù)據(jù)集群;需要對(duì)集群資源進(jìn)行監(jiān)控,集群采用的是CDH集群,采集主要分兩塊進(jìn)行:成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、冠縣網(wǎng)絡(luò)推廣、重慶小程序開(kāi)發(fā)公司、冠縣網(wǎng)絡(luò)營(yíng)銷、冠縣企業(yè)策劃、冠縣品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供冠縣建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:chinadenli.net
HDFS和YARN相關(guān)的指標(biāo)進(jìn)行采集
IDC機(jī)器自身的指標(biāo)進(jìn)行采集
注意: 也許有人會(huì)有疑惑,CM界面已經(jīng)提供了監(jiān)控的圖表,為什么還需要自己進(jìn)行展示。原因在于,這些信息需要集成到內(nèi)部的數(shù)據(jù)平臺(tái)上面去,做成對(duì)應(yīng)的數(shù)據(jù)報(bào)表,可視化的方式展示在自己的數(shù)據(jù)平臺(tái)上實(shí)現(xiàn)思路大致可以分為兩種:
使用CM所提供的Java API去獲取 使用CM提供的REST API去獲取
其實(shí)兩者本質(zhì)上是一樣的,CM所提供的Java API也是按照REST API那套來(lái)實(shí)現(xiàn)的,兩者是保持一致的
核心代碼如下:
public class IdcHostResource {
private static final Logger LOGGER = LoggerFactory.getLogger(IdcHostResource.class);
static RootResourceV18 apiRoot;
// TODO... 寫(xiě)死了,需要改進(jìn)
static {
apiRoot = new ClouderaManagerClientBuilder()
.withHost("cm ip")
.withPort(7180)
.withUsernamePassword("user", "passwd")
.build()
.getRootV18();
}
/**
* 固定獲取Host的基本資源信息
*/
public static List<IdcHostBasicInfo> getAllHostResource() {
List<IdcHostBasicInfo> hosts = new ArrayList<IdcHostBasicInfo>();
HostsResourceV10 hostsResourceV10 = apiRoot.getHostsResource();
List<ApiHost> hostLists = hostsResourceV10.readHosts(DataView.SUMMARY).getHosts();
LOGGER.info("Total" + hostLists.size() + "Host");
for (ApiHost hostList : hostLists) {
IdcHostBasicInfo host = formatHost(hostsResourceV10.readHost(hostList.getHostId()));
LOGGER.info("Host Name:" + host.getHostName());
LOGGER.info("Host Health Summary:" + host.gethostHealthSummary());
LOGGER.info("Host Physical Memory:" + host.getTotalPhysMemBytes());
hosts.add(host);
}
return hosts;
}
public static IdcHostBasicInfo formatHost(ApiHost apiHost) {
IdcHostBasicInfo idcHostBasicInfo = new IdcHostBasicInfo();
idcHostBasicInfo.sethostHealthSummary(apiHost.getHealthSummary().toString());
idcHostBasicInfo.setHostName(apiHost.getHostname());
idcHostBasicInfo.setTotalPhysMemBytes(apiHost.getTotalPhysMemBytes());
return idcHostBasicInfo;
}
/**
* 通過(guò)tsquery來(lái)動(dòng)態(tài)獲取對(duì)應(yīng)的metrics info
*
* @param query
* @param startTime
* @param endTime
* @return
*/
public static List<IdcMetricInfo> getHostMetrics(String query, String startTime, String endTime) throws ParseException {
TimeSeriesResourceV11 timeSeriesResourceV11 = apiRoot.getTimeSeriesResource();
ApiTimeSeriesResponseList responseList = timeSeriesResourceV11.queryTimeSeries(query, startTime, endTime);
List<ApiTimeSeriesResponse> apiTimeSeriesResponseList = responseList.getResponses();
List<IdcMetricInfo> metrics = formatApiTimeSeriesResponseList(apiTimeSeriesResponseList);
return metrics;
}
public static List<IdcMetricInfo> formatApiTimeSeriesResponseList(List<ApiTimeSeriesResponse> apiTimeSeriesResponseList) throws ParseException {
List<IdcMetricInfo> metrics = new ArrayList<IdcMetricInfo>();
DateUtils dateUtils = new DateUtils();
for (ApiTimeSeriesResponse apiTimeSeriesResponse : apiTimeSeriesResponseList) {
List<MetricData> dataList = new ArrayList<MetricData>();
List<ApiTimeSeries> apiTimeSeriesResponseLists = apiTimeSeriesResponse.getTimeSeries();
for (ApiTimeSeries apiTimeSeries : apiTimeSeriesResponseLists) {
LOGGER.info("query sql is: " + apiTimeSeries.getMetadata().getExpression());
IdcMetricInfo metric = new IdcMetricInfo();
metric.setMetricName(apiTimeSeries.getMetadata().getMetricName());
metric.setEntityName(apiTimeSeries.getMetadata().getEntityName());
metric.setStartTime(apiTimeSeries.getMetadata().getStartTime().toString());
metric.setEndTime(apiTimeSeries.getMetadata().getEndTime().toString());
for (ApiTimeSeriesData apiTimeSeriesData : apiTimeSeries.getData()) {
MetricData data = new MetricData();
// 在Data中插入EntityName,避免重復(fù)數(shù)據(jù)的產(chǎn)生
data.seHostname(apiTimeSeries.getMetadata().getEntityName());
// CM默認(rèn)得到的時(shí)間格式為 EEE MMM dd HH:mm:ss 'CST' yyyy,轉(zhuǎn)換時(shí)間格式為 yyyy-MM-dd HH:mm:ss
data.setTimestamp(dateUtils.parse(apiTimeSeriesData.getTimestamp().toString()));
data.setType(apiTimeSeriesData.getType());
data.setValue(apiTimeSeriesData.getValue());
dataList.add(data);
}
metric.setData(dataList);
metrics.add(metric);
}
}
return metrics;
}
注意:
代碼中涉及到的DateUtils需要自己去進(jìn)行實(shí)現(xiàn)
通過(guò)這部分代碼可以通過(guò)傳入tsquery的方式去獲取對(duì)應(yīng)的idc集群的metric信息;接下來(lái)的代碼我們只需要通過(guò)ServiceImpl去實(shí)現(xiàn)對(duì)應(yīng)的監(jiān)控指標(biāo)的獲取代碼即可
如果想通過(guò)cm api與spring boot整合的,這其中還會(huì)遇到2個(gè)問(wèn)題:
依賴沖突問(wèn)題,主要表現(xiàn)在jackson與cxf的沖突;通過(guò)排jar包的方式可以解決正則解析錯(cuò)誤,該問(wèn)題為cm使用過(guò)程中的一個(gè)坑,目前仍在排查當(dāng)中,具體表現(xiàn)形式為:
這里面有個(gè)空格,因此在編譯的過(guò)程中直接會(huì)報(bào)正則解析的錯(cuò)誤;但是我們可以發(fā)現(xiàn)在cm 6.x的api版本中已經(jīng)沒(méi)有這個(gè)問(wèn)題了:
因此可以直接升級(jí)api的版本來(lái)解決該問(wèn)題,但是隨之帶來(lái)的問(wèn)題就是與線上運(yùn)行的cm版本不一致(線上的版本為5.13.2),因此對(duì)于如何解決仍然需要思考;不過(guò)經(jīng)過(guò)測(cè)試發(fā)現(xiàn),使用cm 6.x版本的api,對(duì)于目前線上那套版本的相關(guān)指標(biāo)并不影響
分享題目:你懂集群monitoring么?(一)——IDC機(jī)房有關(guān)技術(shù)指標(biāo)獲取
路徑分享:http://chinadenli.net/article20/gidoco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、企業(yè)網(wǎng)站制作、網(wǎng)站排名、定制開(kāi)發(fā)、全網(wǎng)營(yíng)銷推廣、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)