調試 ambari-server 總結

剛開始debug ambari-server的時候,不少邏輯都是第一次接觸。其中有不少知識點仍是記錄一下的好,作個備忘。這些知識點對於自定義api的開發仍是頗有做用的。java

1. api的子href的最後一個字符串如何定義?例如,指定一個id?

解答:apache

ambari 2.6json

編輯key_properties.json,將當前資源類型與含有id的value相映射。api

舉例:微信

<!--more-->ide

ambari 2.7大數據

路徑:org/apache/ambari/server/controller/internal/RackResourceProvider.javaui

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有關debug

2)有何意義?

rack/rack_name=rack1這樣賦值有關。code

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實現具體的操做。

持續更新中,敬請關注...


點關注,不迷路

好了各位,以上就是這篇文章的所有內容了,能看到這裏的人呀,都是 人才

白嫖很差,創做不易。 各位的支持和承認,就是我創做的最大動力,咱們下篇文章見!

若是本篇博客有任何錯誤,請批評指教,不勝感激 !

本文來自: 微信公衆號【大數據實戰演練】。閱讀更多精彩好文,歡迎關注微信公衆號【大數據實戰演練】。

相關文章
相關標籤/搜索