背景:
私たち自身のIDCの部屋、IDCの部屋に基づいて大規模なデータクラスタを構築し、クラスタリソースを監視する必要、CDHクラスタは、主に2つのポイントを収集して、クラスタを使用しています。糸HDFSおよび関連指標収集
IDCマシン自体は、コレクションメトリック
注:一部の人々が疑問を持っていることが、CMインタフェースは、監視するためのチャートを提供している、そしてなぜ私たちは自分自身を表示する必要があります。その理由は、データ内の情報は、データ報告に対応させ、上記のプラットフォームに統合する必要があること、それらのプラットフォーム上でデータを表示する視覚的な方法でありますアイデアの実現には、大きく2種類に分けることができます。
使用CM所提供的Java API去获取 使用CM提供的REST API去获取
実際には、両者が本質的に同じで、JavaのAPI CMも達成するために、REST APIのセットに基づいて提供され、一貫しているどちらも
コアのコードは次の通りであります:
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<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;
}
/**
* 通过tsquery来动态获取对应的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,避免重复数据的产生
data.seHostname(apiTimeSeries.getMetadata().getEntityName());
// CM默认得到的时间格式为 EEE MMM dd HH:mm:ss 'CST' yyyy,转换时间格式为 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
コードのtsquery道のこの部分を通過することによりメトリック対応するクラスタIDCの情報を取得するために行くことができます。私たちはServiceImplてコードを取得するには、対応する指標のモニタリングを実現するために、次のコードが必要あなたはでき
ますが、我々は二つの問題が発生しますその春ブーツ、とセンチAPIの統合渡す場合:
依存性の競合、主にCXFジャクソンさんとの競合では、行はジャーパッケージの方法によって解決することができます定期的な解析エラー、問題はまだ調査中、具体的な形で、使用中のピットCMは、次のとおりです。
そして、そこにエラーをコンパイルする過程で定期的解決に直接報告されますので、スペースが、ある;しかし、我々はこの問題のAPIセンチ6.xのバージョンで見つけることができていません。
だから、直接アップグレードすることができ、問題を解決するために、後でAPIが、問題が付随するCMのバージョンが(オンライン版は5.13.2です)オンライン操作と矛盾しているので、まだ解決する方法を考える必要があるということです。しかし、試験後我々は、関連する一連の指標のためのAPIの使用CM 6.xのバージョンは、現在のオンライン版は影響しないことがわかりました