java 監控CDH叢集獲取叢集資訊
技術標籤:hadoop
package com.guodi.api.util;
import com.alibaba.fastjson.JSON;
import com.cloudera.api.ClouderaManagerClientBuilder;
import com.cloudera.api.DataView;
import com.cloudera.api.model.;
import com.cloudera.api.v10.HostsResourceV10;
import com.cloudera.api.v10.ServicesResourceV10;
import com.cloudera.api.v11.RolesResourceV11;
import com.cloudera.api.v18.ServicesResourceV18;
import com.cloudera.api.v6.TimeSeriesResourceV6;
import com.guodi.api.model.;
import com.guodi.api.model.CDH.*;
import com.guodi.api.service.IClusterRoleService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class CDHUtil {
static RootResourceV18 apiRoot; @Autowired IClusterRoleService clusterRoleService; static { apiRoot = new ClouderaManagerClientBuilder().withHost("10.0.1.133"). withPort(Integer.valueOf(7180)) .withUsernamePassword("admin", "admin").build().getRootV18(); } private final static Logger LOGGER = LoggerFactory.getLogger(CDHUtil.class); /*獲取cloudera-manager中所有叢集的資訊*/ public static void getAllCluster(){ LOGGER.info("開始測試的時間為{},**************開始測試獲取ClouderaManager叢集資訊**************",new Date()); ApiClusterList apiClusterList = apiRoot.getClustersResource().readClusters(DataView.FULL); LOGGER.info("ClouderaManager 共管理了{}個叢集",apiClusterList.getClusters().size()); for(ApiCluster apiCluster : apiClusterList){ ApiCluster apiCluster1 = apiRoot.getClustersResource().readCluster(apiCluster.getName()); LOGGER.info("叢集名稱 {}",apiCluster1.getName()); LOGGER.info("叢集顯示名稱 {}",apiCluster1.getDisplayName()); LOGGER.info("CDH 版本:{}-{}",apiCluster1.getVersion(),apiCluster.getFullVersion()); LOGGER.info("ClusterUrl {}",apiCluster1.getClusterUrl()); LOGGER.info("HostUrl {}",apiCluster1.getHostsUrl()); LOGGER.info("Cluster Uuid {}",apiCluster1.getUuid()); LOGGER.info("叢集執行狀態 {}",apiCluster1.getEntityStatus()); } LOGGER.info("結束測試的時間為{},**************結束測試獲取ClouderaManager叢集資訊**************",new Date()); } /*獲取cloudera-manager中每個叢集的每個主機的詳細資訊 * */ public static void getAllHost(){ LOGGER.info("開始測試的時間為{},**************開始測試叢集主機執行狀態**************",DateUtils.getTime()); HostsResourceV10 hostsResourceV10 = apiRoot.getHostsResource(); List<ApiHost> hostList = hostsResourceV10.readHosts(DataView.SUMMARY).getHosts(); LOGGER.info("總共有 {} 臺主機組成叢集",hostList.size()); for(ApiHost apiHost:hostList){ LOGGER.info("---------------------------------------------"); Host host = formatHost(hostsResourceV10.readHost(apiHost.getHostId())); LOGGER.info("主機Id : {}",host.getHostId()); LOGGER.info("主機名: {}",host.getHostName()); LOGGER.info("主機IP: {}",host.getIpAddress()); LOGGER.info("主機執行緒數:{}",host.getNumCores()); LOGGER.info("上次上報心跳時間 :{}",host.getLastHeart()); LOGGER.info("核心數:{}",host.getNumPhysicalCores()); LOGGER.info("機架:{}",host.getRack()); LOGGER.info("記憶體(G):{}",host.getTotalPhysMemBytes()); LOGGER.info("程序:{}", JSON.toJSON(host.getServices())); LOGGER.info("---------------------------------------------"); } LOGGER.info("結束測試的時間為{},**************結束測試叢集主機執行狀態**************",DateUtils.getTime()); } public static Host formatHost(ApiHost apiHost){ Host host = new Host(); List<String> services = new ArrayList<>(); host.setHostId(apiHost.getHostId()); host.setHostName(apiHost.getHostname()); host.setIpAddress(apiHost.getIpAddress()); host.setNumCores(apiHost.getNumCores()); host.setNumPhysicalCores(apiHost.getNumPhysicalCores()); host.setLastHeart(apiHost.getLastHeartbeat().toString()); host.setRack(apiHost.getRackId()); host.setTotalPhysMemBytes(apiHost.getTotalPhysMemBytes()/1073741824); for(ApiRoleRef apiRoleRef:apiHost.getRoleRefs()){ services.add(apiRoleRef.getRoleName()); } host.setServices(services); return host; } /*獲取cloudera-manager上所有叢集的所有服務的狀態(這裡只是粗略的,不涉及時間點位的)*/ public static void getAllService(){ LOGGER.info("開始測試的時間為{},**************開始測試叢集服務執行狀態**************",DateUtils.getTime()); ApiClusterList apiClusterList = apiRoot.getClustersResource().readClusters(DataView.SUMMARY); for(ApiCluster apiCluster:apiClusterList){ LOGGER.info("叢集名稱:{}",apiCluster.getDisplayName()); LOGGER.info("CDH 版本:{}-{}",apiCluster.getVersion(),apiCluster.getFullVersion()); ServicesResourceV10 servicesResourceV10 = apiRoot.getClustersResource().getServicesResource(apiCluster.getName()); List<ApiService> apiServices = servicesResourceV10.readServices(DataView.FULL).getServices(); LOGGER.info("叢集總共有:{} 個service 在執行",apiServices.size()); for(ApiService apiService:apiServices){ Service service = formatService(apiService); LOGGER.info("***********************************"); LOGGER.info("service 名稱 {}",service.getName()); LOGGER.info("service 型別 {}",service.getType()); for(Agent agent:service.getAgentList()) { LOGGER.info("節點名稱 {}", agent.getName()); LOGGER.info("節點狀態 {}", agent.getStatus()); } LOGGER.info("***********************************"); } } LOGGER.info("結束測試的時間為{},**************結束測試叢集服務執行狀態**************",DateUtils.getTime()); } public static Service formatService(ApiService apiService){ Service service = new Service(); List<Agent> agents = new ArrayList<>(); service.setName(apiService.getName()); service.setType(apiService.getType()); for(ApiHealthCheck apiHealthCheck:apiService.getHealthChecks()){ Agent agent =new Agent(); agent.setName(apiHealthCheck.getName()); agent.setStatus(apiHealthCheck.getSummary()); agents.add(agent); } service.setAgentList(agents); return service; }
/獲取cloudera-manager上所有叢集的所有服務的狀態(這裡只是粗略的,不涉及時間點位的)/
public static void getAllServiceRoles(){
LOGGER.info(“開始測試的時間為{},開始測試叢集各個服務的roles執行狀態”,DateUtils.getTime());
ApiClusterList apiClusterList = apiRoot.getClustersResource().readClusters(DataView.SUMMARY);
for(ApiCluster apiCluster:apiClusterList){
LOGGER.info("叢集名稱:{}",apiCluster.getDisplayName());
LOGGER.info("CDH 版本:{}-{}",apiCluster.getVersion(),apiCluster.getFullVersion());
ServicesResourceV18 servicesResourceV18 = apiRoot.getClustersResource().getServicesResource(apiCluster.getName());
//用於列印日誌
List<ApiService> apiServices = servicesResourceV18.readServices(DataView.FULL).getServices();
LOGGER.info("叢集總共有:{} 個service 在執行",apiServices.size());
for(ApiService apiService:apiServices){
RolesResourceV11 rolesResourceV11 = servicesResourceV18.getRolesResource(apiService.getName());
LOGGER.info("---------------------服務名稱是{}---------------------",apiService.getName());
for(ApiRole apiRole :rolesResourceV11.readRoles()){
ClusterRole clusterRole = new ClusterRole();
LOGGER.info("***************************",apiRole.getName());
LOGGER.info("role名稱 {}",apiRole.getName());
LOGGER.info("role型別 {}",apiRole.getType());
LOGGER.info("所屬叢集 {}",apiRole.getServiceRef().getClusterName());
LOGGER.info("所屬服務 {}",apiRole.getServiceRef().getServiceName());
LOGGER.info("主機ID {}",apiRole.getHostRef().getHostId());
LOGGER.info("roleUrl {}",apiRole.getRoleUrl());
LOGGER.info("role狀態 {}",apiRole.getRoleState());
LOGGER.info("執行狀態總結 {}",apiRole.getHealthSummary());
LOGGER.info("entityStatus {}",apiRole.getEntityStatus());
LOGGER.info("roleConfigGroupName {}",apiRole.getRoleConfigGroupRef().getRoleConfigGroupName());
LOGGER.info("configStalenessStatus {}",apiRole.getConfigStalenessStatus());
LOGGER.info("haStatus {}",apiRole.getHaStatus());
for(ApiHealthCheck apiHealthCheck:apiRole.getHealthChecks()){
LOGGER.info("health check name {}",apiHealthCheck.getName());
LOGGER.info("health check summary {}",apiHealthCheck.getSummary());
LOGGER.info("health check suppressed {}",apiHealthCheck.getSuppressed());
}
LOGGER.info("***************************");
}
LOGGER.info("--------------------------------------------------------",apiService.getName());
}
}
LOGGER.info("結束測試的時間為{},**************結束測試叢集各個服務的roles執行狀態**************",DateUtils.getTime());
}
/*
獲取cloudera-manager中某個服務的時間序列點位
* */
public static List<Metric> formatApiTimeSeriesResponse(List<ApiTimeSeriesResponse> apiTimeSeriesResponseList){
List<Metric> metrics = new ArrayList<>();
for(ApiTimeSeriesResponse apiTimeSeriesResponse:apiTimeSeriesResponseList) {
List<Data> dataList = new ArrayList<>();
List<ApiTimeSeries> apiTimeSeriesList = apiTimeSeriesResponse.getTimeSeries();
for (ApiTimeSeries apiTimeSeries : apiTimeSeriesList) {
Metric metric = new Metric();
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()) {
Data data = new Data();
data.setTimestamp(apiTimeSeriesData.getTimestamp().toString());
data.setType(apiTimeSeriesData.getType());
data.setValue(apiTimeSeriesData.getValue());
dataList.add(data);
}
metric.setData(dataList);
metrics.add(metric);
}
}
return metrics;
}
/*
獲取cloudera-manager中某個服務的時間序列點位
* */
public static List<Metric> getServiceMetrics(String query, String startTime , String endTime){
TimeSeriesResourceV6 timeSeriesResourceV6 = apiRoot.getTimeSeriesResource();
String[] params = new String []{query,startTime,endTime};
LOGGER.info("query sql is {} ,startTime is {} ,endTime is now",params);
LOGGER.info("開始測試的時間為{},**************開始查詢某個服務點位狀態**************",DateUtils.getTime());
ApiTimeSeriesResponseList response = timeSeriesResourceV6.queryTimeSeries(query,startTime,endTime);
List<ApiTimeSeriesResponse> apiTimeSeriesResponseList = response.getResponses();
List<Metric> metrics = formatApiTimeSeriesResponse(apiTimeSeriesResponseList);
LOGGER.info("查詢時間序列點位:{}", JSON.toJSON(metrics));
LOGGER.info("結束測試的時間為{},**************結束查詢某個服務點位狀態**************",DateUtils.getTime());
return metrics;
}
public static void main(String[] args) {
// 獲取cloudera-manager中所有叢集的資訊
// getAllCluster();
// 獲取cloudera-manager中每個叢集的每個主機的詳細資訊
// getAllHost();
// getAllService();
getAllServiceRoles();
// getServiceMetrics(“SELECT health_good_rate * 100 AS “good health” WHERE entityName = “hdfs” AND category = SERVICE”
// ,“2019-12-19”,“now”);
}
}