• 调试 ambari-server 总结


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

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

    解答:

    ambari 2.6

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

    举例:

    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有关

    2)有何意义?

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

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

    1)如何定义?

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

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

    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

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

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

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

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

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

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

    7. api的入口

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

    持续更新中,敬请关注...


    点关注,不迷路

    好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是 人才

    白嫖不好,创作不易。 各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

    如果本篇博客有任何错误,请批评指教,不胜感激 !

  • 相关阅读:
    Codeforces 525C Om Nom and Candies 枚举 + 复杂度分析
    Codeforces 526B Om Nom and Dark Park 树形dp
    Codeforces 526A King of Thieves 枚举
    Regionals 2014 Asia
    Regionals 2014 Asia
    access数据库和sqlsever数据库sql语句的布尔值boolean的写法
    取消阴影行
    引用其他单元的2种方法
    选中阴影行
    全选
  • 原文地址:https://www.cnblogs.com/createboke/p/12234215.html
Copyright © 2020-2023  润新知