调试ambari-server总结

刚开始debug ambari-server的时候,很多逻辑都是第一次接触。其中有很多知识点还是记录一下的好,做个备忘。这些知识点对于自定义api的开发还是很有作用的。

1. api的子href的最后一个字符串如何定义?例如,指定一个id?

解答:

ambari 2.6

编辑key_properties.json,将当前资源类型与含有id的value相映射。

举例:

调试ambari-server总结_第1张图片

调试ambari-server总结_第2张图片

ambari 2.7

路径:org/apache/ambari/server/controller/internal/RackResourceProvider.java

public static final String RACK_ID_PROPERTY_ID = PropertyHelper.getPropertyId("rack", "rack_id");
    public static final String RACK_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("rack", "rack_name");
    public static final String RACK_HEIGHT_PROPERTY_ID = PropertyHelper.getPropertyId("rack", "rack_height");
    public static final String RACK_TYPE_PROPERTY_ID = PropertyHelper.getPropertyId("rack", "rack_type");
    public static final String RACK_LOCATION_PROPERTY_ID = PropertyHelper.getPropertyId("rack", "rack_location");
    public static final String RACK_DESCRIPTION_PROPERTY_ID = PropertyHelper.getPropertyId("rack", "rack_description");

private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
        .put(Resource.Type.RepositoryVersion, RACK_NAME_PROPERTY_ID)
        .put(Resource.Type.Rack, RACK_ID_PROPERTY_ID)
        .put(Resource.Type.User, RACK_HEIGHT_PROPERTY_ID)
        .put(Resource.Type.Member, RACK_TYPE_PROPERTY_ID)
        .put(Resource.Type.Task, RACK_LOCATION_PROPERTY_ID)
        .put(Resource.Type.Auditlog, RACK_DESCRIPTION_PROPERTY_ID)
        .build();

2. request如何取值?意义何在?

1)如何取值

QueryImpl.createRequest()方法内的requestedProperties属性与XXXResourceProvider()keyPropertyIds有关

调试ambari-server总结_第3张图片

调试ambari-server总结_第4张图片

2)有何意义?

rack/rack_name=rack1这样赋值有关。

3. predicate如何定义?意义何在?

1)如何定义?

QueryImpl.createPredicate() ==> QueryImpl.createInternalPredicate() ==> ClusterControllerImpl.getSchema() ==> QueryImpl.createInternalPredicate() ==>

907~914行,setPredicates() 作用就是keyPropertyIds的type与RackHostResourceProvider相比较,相同的就是predicate

调试ambari-server总结_第5张图片

entry.getValue() 这个值会和Rackhost的value值相比较,并返回boolean值。如果为true,则合并。

Predicate 可能会有多条匹配,这样多条的entry.getValue()会与对应的Rackhost的value值比较,返回true或false。如果有一个不对应,则两个Resource.Type的数据不合并,这里被坑过,特此记录。

注:RackResourceProvider和RackHostResourceProvider的keyPropertyIds只能保证rack_name字段的key一致。

2)有何意义?

pridicate会在子数据的判断上(是否合并数据)起作用。

4. getKeyValueMap()

获取的是资源类型=>value 、、 比如: Rack ==> null

调试ambari-server总结_第6张图片

5. 编译失败,改正了以后还是报那个地方失败?

这时候就应该考虑一下 将target文件删掉,或直接mvn clean,重新生成这个文件了,可能是编译后的一些class文件没有被替换。

6. 使用fields来拼接展示不用resource类型的数据?

RackResourceDefinition.getSubResourceDefinitions()里面注册要展示其他resource的类型,调用xxxResourceDefinition.getPluralName(),最后就可以使用fields=rack_hosts来调取数据。

org/apache/ambari/server/api/resources/RackResourceDefinition.java

调试ambari-server总结_第7张图片

org/apache/ambari/server/api/resources/RackHostResourceDefinition.java

调试ambari-server总结_第8张图片

7. api的入口

xxxService.java是api的入口,经过一系列流程操作,进入到xxxResourceProvider.java,里面有getResources()createResources()deleteResources()updateResources()方法,这些方法具体实现是在AmbariManagementController.java里面定义,在AmbariManagementControllerImpl.java实现具体的操作。

持续更新中,敬请关注…


更多精彩干货内容,请关注微信公众号

调试ambari-server总结_第9张图片

你可能感兴趣的:(Ambari,java)