Cloudera Manager API通过Springboot进行访问配置如下,遇到了解析问题处理如下!

废话少说,直接配置给出,~~~

  pom.xml

...
<!--============================ jackson =========================== -->

            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.2.3</version>
            </dependency>

            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>2.3.3</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.3.3</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.jaxrs</groupId>
                <artifactId>jackson-jaxrs-base</artifactId>
                <version>2.3.3</version>
            </dependency>

            <dependency>
                <groupId>com.fasterxml.jackson.jaxrs</groupId>
                <artifactId>jackson-jaxrs-json-provider</artifactId>
                <version>2.8.0</version>
            </dependency>

            <dependency>
                <groupId>com.fasterxml.jackson.module</groupId>
                <artifactId>jackson-module-jaxb-annotations</artifactId>
                <version>2.8.0</version>
            </dependency>



            <dependency>
                <groupId>javax.ws.rs</groupId>
                <artifactId>javax.ws.rs-api</artifactId>
                <version>2.0</version>
            </dependency>


            <!-- cxf rest -->
            <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-rt-frontend-jaxrs</artifactId>
                <version>2.2</version>
            </dependency>

            <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-rt-ws-policy</artifactId>
                <version>2.3.5</version>
            </dependency>

            <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-rt-wsdl</artifactId>
                <version>3.1.0</version>
            </dependency>


            <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-rt-transports-http</artifactId>
                <version>3.2.0</version>
            </dependency>


            <dependency>
                <groupId>com.cloudera.api</groupId>
                <artifactId>cloudera-manager-api</artifactId>
                <version>5.15.1</version>
            </dependency>

...

Java代码

package com.xxxxxx

import com.alibaba.fastjson.JSON;
import com.cloudera.api.ClouderaManagerClientBuilder;
import com.cloudera.api.model.ApiTimeSeries;
import com.cloudera.api.model.ApiTimeSeriesData;
import com.cloudera.api.model.ApiTimeSeriesResponse;
import com.cloudera.api.model.ApiTimeSeriesResponseList;
import com.cloudera.api.v11.TimeSeriesResourceV11;
import com.cloudera.api.v18.RootResourceV18;
import com.xx.xxx.xxx.xx.DateTimeUtils;


import java.util.ArrayList;
import java.util.List;

public class ClouderaManagerServiceMetrics {

    private RootResourceV18 apiRoot;

    public ClouderaManagerServiceMetrics(){
        apiRoot = new ClouderaManagerClientBuilder()
//                    .withHost("111.111.111.111")
//                    .withPort(2222)
                .withHost("cm.xxx.xxx")
                .withUsernamePassword("metrica", "cdd57977915014")
                .build()
                .getRootV18();
    }

 

    public  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;
    }

    public  List<Metric> getServiceMetrics(String query,String startTime , String endTime){
        TimeSeriesResourceV11 timeSeriesResourceV6 = apiRoot.getTimeSeriesResource();
        String[] params = new String []{query,startTime,endTime};
        log.info("query sql is {} ,startTime is {} ,endTime is now",params);

        log.info("开始测试的时间为{},**************开始查询某个服务点位状态**************", DateTimeUtils.calendar().getTime());
        ApiTimeSeriesResponseList response = timeSeriesResourceV6.queryTimeSeries(query,startTime,endTime);
        List<ApiTimeSeriesResponse> apiTimeSeriesResponseList = response.getResponses();
        List<Metric> metrics = formatApiTimeSeriesResponse(apiTimeSeriesResponseList);
        log.info("查询时间序列点位:{}", JSON.toJSON(metrics));
        log.info("结束测试的时间为{},**************结束查询某个服务点位状态**************",DateTimeUtils.calendar().getTime());
        return metrics;
    }

}

class Metric {
    private String metricName;

    private String entityName;

    private String startTime;

    private String endTime;

    List<Data> data = new ArrayList<>();

    public void setMetricName(String metricName) {
        this.metricName = metricName;
    }

    public void setEntityName(String entityName) {
        this.entityName = entityName;
    }

    public void setStartTime(String startTime) {
        this.startTime = startTime;
    }

    public void setEndTime(String endTime) {
        this.endTime = endTime;
    }

    public void setData(List<Data> data) {
        this.data = data;
    }

    public String getMetricName() {
        return metricName;
    }

    public String getEntityName() {
        return entityName;
    }

    public String getStartTime() {
        return startTime;
    }

    public String getEndTime() {
        return endTime;
    }

    public List<Data> getData() {
        return data;
    }
}

class Data {
    private String timestamp;

    private Double value;

    private String type;

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

    public void setValue(Double value) {
        this.value = value;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getTimestamp() {
        return timestamp;
    }

    public Double getValue() {
        return value;
    }

    public String getType() {
        return type;
    }
}

  然后在main方法里校验

package com.xxxx;

import com.xxxx.xxx.xxx.ClouderaManagerServiceMetrics;

/**
 * Description
 *
 * @author liaozhanggen on 2018/3/15.
 */
public class TestMain {

    public static void main(String[] args) throws Exception {

        new ClouderaManagerServiceMetrics().getServiceMetrics("SELECT health_good_rate * 100 AS 'good health' WHERE entityName = 'hbase' AND category = SERVICE"                ,"2018-11-13","2018-11-14");
    }
}

  运行的异常如下!

....
Exception in thread "main" com.google.common.util.concurrent.UncheckedExecutionException: java.util.regex.PatternSyntaxException: Illegal repetition near index 12
/configFiles/{configFileName : \.*}(/.*)?
            ^
	at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2203)
	at com.google.common.cache.LocalCache.get(LocalCache.java:3937)
	at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3941)
	at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4824)
	at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4830)
	at com.cloudera.api.ClouderaManagerClientBuilder.build(ClouderaManagerClientBuilder.java:273)
	at com.cloudera.api.ClouderaManagerClientBuilder.build(ClouderaManagerClientBuilder.java:254)
	at com.xx.xxx.x.xxx.ClouderaManagerServiceMetrics.<init>(ClouderaManagerServiceMetrics.java:28)
	at com.xxx.xxxx.TestMain.main(TestMain.java:16)
Caused by: java.util.regex.PatternSyntaxException: Illegal repetition near index 12
/configFiles/{configFileName : \.*}(/.*)?
            ^
	at java.util.regex.Pattern.error(Pattern.java:1955)
	at java.util.regex.Pattern.closure(Pattern.java:3157)
	at java.util.regex.Pattern.sequence(Pattern.java:2134)
	at java.util.regex.Pattern.expr(Pattern.java:1996)
	at java.util.regex.Pattern.compile(Pattern.java:1696)
	at java.util.regex.Pattern.<init>(Pattern.java:1351)
	at java.util.regex.Pattern.compile(Pattern.java:1028)
	at org.apache.cxf.jaxrs.model.URITemplate.<init>(URITemplate.java:96)
	at org.apache.cxf.jaxrs.model.URITemplate.createTemplate(URITemplate.java:289)
	at org.apache.cxf.jaxrs.utils.ResourceUtils.createOperationInfo(ResourceUtils.java:92)
	at org.apache.cxf.jaxrs.utils.ResourceUtils.evaluateResourceClass(ResourceUtils.java:68)
	at org.apache.cxf.jaxrs.utils.ResourceUtils.createClassResourceInfo(ResourceUtils.java:54)
	at org.apache.cxf.jaxrs.utils.ResourceUtils.evaluateResourceClass(ResourceUtils.java:75)
	at org.apache.cxf.jaxrs.utils.ResourceUtils.createClassResourceInfo(ResourceUtils.java:54)
	at org.apache.cxf.jaxrs.utils.ResourceUtils.evaluateResourceClass(ResourceUtils.java:75)
	at org.apache.cxf.jaxrs.utils.ResourceUtils.createClassResourceInfo(ResourceUtils.java:54)
	at org.apache.cxf.jaxrs.utils.ResourceUtils.evaluateResourceClass(ResourceUtils.java:75)
	at org.apache.cxf.jaxrs.utils.ResourceUtils.createClassResourceInfo(ResourceUtils.java:54)
	at org.apache.cxf.jaxrs.utils.ResourceUtils.evaluateResourceClass(ResourceUtils.java:75)
	at org.apache.cxf.jaxrs.utils.ResourceUtils.createClassResourceInfo(ResourceUtils.java:54)
	at org.apache.cxf.jaxrs.utils.ResourceUtils.evaluateResourceClass(ResourceUtils.java:75)
	at org.apache.cxf.jaxrs.utils.ResourceUtils.createClassResourceInfo(ResourceUtils.java:54)
	at org.apache.cxf.jaxrs.JAXRSServiceFactoryBean.createResourceInfo(JAXRSServiceFactoryBean.java:129)
	at org.apache.cxf.jaxrs.JAXRSServiceFactoryBean.setResourceClass(JAXRSServiceFactoryBean.java:119)
	at org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean.setServiceClass(JAXRSClientFactoryBean.java:83)
	at org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean.setResourceClass(JAXRSClientFactoryBean.java:79)
	at com.cloudera.api.ClouderaManagerClientBuilder$1.load(ClouderaManagerClientBuilder.java:103)
	at com.cloudera.api.ClouderaManagerClientBuilder$1.load(ClouderaManagerClientBuilder.java:99)
	at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3527)
	at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2319)
	at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2282)
	at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2197)
	... 8 more
....

引起的原因如下

建议解方式如下  

1. 重写上面工具类的正则校验方式;(比较靠谱,反编译,再编译)

2. 修改cloudera manager的服务器包;(似乎不可能,不可能随便修改生产环境的cdh)
3. 再试下其他Jar版本(社区问下其他调用成功的同事)

猜你喜欢

转载自blog.csdn.net/liaonanfeng88/article/details/84099991