真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

你懂集群monitoring么?(一)——IDC機房有關(guān)技術(shù)指標獲取

背景:
公司自建IDC機房,基于IDC機房構(gòu)建大數(shù)據(jù)集群;需要對集群資源進行監(jiān)控,集群采用的是CDH集群,采集主要分兩塊進行:

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于成都網(wǎng)站建設、成都網(wǎng)站設計、冠縣網(wǎng)絡推廣、重慶小程序開發(fā)公司、冠縣網(wǎng)絡營銷、冠縣企業(yè)策劃、冠縣品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學生創(chuàng)業(yè)者提供冠縣建站搭建服務,24小時服務熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com

HDFS和YARN相關(guān)的指標進行采集
IDC機器自身的指標進行采集
注意: 也許有人會有疑惑,CM界面已經(jīng)提供了監(jiān)控的圖表,為什么還需要自己進行展示。原因在于,這些信息需要集成到內(nèi)部的數(shù)據(jù)平臺上面去,做成對應的數(shù)據(jù)報表,可視化的方式展示在自己的數(shù)據(jù)平臺上

實現(xiàn)思路大致可以分為兩種:

       使用CM所提供的Java API去獲取
       使用CM提供的REST API去獲取

其實兩者本質(zhì)上是一樣的,CM所提供的Java API也是按照REST API那套來實現(xiàn)的,兩者是保持一致的

核心代碼如下:

public class IdcHostResource {
    private static final Logger LOGGER = LoggerFactory.getLogger(IdcHostResource.class);

static RootResourceV18 apiRoot;

// TODO... 寫死了,需要改進
static {
    apiRoot = new ClouderaManagerClientBuilder()
            .withHost("cm ip")
            .withPort(7180)
            .withUsernamePassword("user", "passwd")
            .build()
            .getRootV18();
}

/**
 * 固定獲取Host的基本資源信息
 */
public static List getAllHostResource() {
    List hosts = new ArrayList();
    HostsResourceV10 hostsResourceV10 = apiRoot.getHostsResource();
    List 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;
}

/**
 * 通過tsquery來動態(tài)獲取對應的metrics info
 *
 * @param query
 * @param startTime
 * @param endTime
 * @return
 */
public static List getHostMetrics(String query, String startTime, String endTime) throws ParseException {
    TimeSeriesResourceV11 timeSeriesResourceV11 = apiRoot.getTimeSeriesResource();
    ApiTimeSeriesResponseList responseList = timeSeriesResourceV11.queryTimeSeries(query, startTime, endTime);
    List apiTimeSeriesResponseList = responseList.getResponses();
    List metrics = formatApiTimeSeriesResponseList(apiTimeSeriesResponseList);
    return metrics;
}

public static List formatApiTimeSeriesResponseList(List apiTimeSeriesResponseList) throws ParseException {
    List metrics = new ArrayList();
    DateUtils dateUtils = new DateUtils();
    for (ApiTimeSeriesResponse apiTimeSeriesResponse : apiTimeSeriesResponseList) {
        List dataList = new ArrayList();
        List 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,避免重復數(shù)據(jù)的產(chǎn)生
                data.seHostname(apiTimeSeries.getMetadata().getEntityName());
                // CM默認得到的時間格式為 EEE MMM dd HH:mm:ss 'CST' yyyy,轉(zhuǎn)換時間格式為 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需要自己去進行實現(xiàn)
通過這部分代碼可以通過傳入tsquery的方式去獲取對應的idc集群的metric信息;接下來的代碼我們只需要通過ServiceImpl去實現(xiàn)對應的監(jiān)控指標的獲取代碼即可
如果想通過cm api與spring boot整合的,這其中還會遇到2個問題:
依賴沖突問題,主要表現(xiàn)在jackson與cxf的沖突;通過排jar包的方式可以解決

正則解析錯誤,該問題為cm使用過程中的一個坑,目前仍在排查當中,具體表現(xiàn)形式為:

你懂集群monitoring么?(一)—— IDC機房有關(guān)技術(shù)指標獲取
這里面有個空格,因此在編譯的過程中直接會報正則解析的錯誤;但是我們可以發(fā)現(xiàn)在cm 6.x的api版本中已經(jīng)沒有這個問題了:
你懂集群monitoring么?(一)—— IDC機房有關(guān)技術(shù)指標獲取

因此可以直接升級api的版本來解決該問題,但是隨之帶來的問題就是與線上運行的cm版本不一致(線上的版本為5.13.2),因此對于如何解決仍然需要思考;不過經(jīng)過測試發(fā)現(xiàn),使用cm 6.x版本的api,對于目前線上那套版本的相關(guān)指標并不影響


網(wǎng)頁標題:你懂集群monitoring么?(一)——IDC機房有關(guān)技術(shù)指標獲取
標題URL:http://weahome.cn/article/gidoco.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部