剛開始debug ambari-server的時候,不少邏輯都是第一次接觸。其中有不少知識點仍是記錄一下的好,作個備忘。這些知識點對於自定義api的開發仍是頗有做用的。java
解答: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();
QueryImpl.createRequest()方法內的requestedProperties屬性與XXXResourceProvider()的keyPropertyIds有關debug
和rack/rack_name=rack1
這樣賦值有關。code
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一致。
pridicate會在子數據的判斷上(是否合併數據)起做用。
獲取的是資源類型=>value 、、 好比: Rack ==> null
這時候就應該考慮一下 將target文件刪掉,或直接mvn clean
,從新生成這個文件了,多是編譯後的一些class文件沒有被替換。
在RackResourceDefinition.getSubResourceDefinitions()裏面註冊要展現其餘resource的類型,調用xxxResourceDefinition.getPluralName(),最後就可使用fields=rack_hosts來調取數據。
org/apache/ambari/server/api/resources/RackResourceDefinition.java
org/apache/ambari/server/api/resources/RackHostResourceDefinition.java
xxxService.java是api的入口,通過一系列流程操做,進入到xxxResourceProvider.java,裏面有getResources()
、createResources()
、deleteResources()
、updateResources()
方法,這些方法具體實現是在AmbariManagementController.java裏面定義
,在AmbariManagementControllerImpl.java
實現具體的操做。
持續更新中,敬請關注...
好了各位,以上就是這篇文章的所有內容了,能看到這裏的人呀,都是 人才。
白嫖很差,創做不易。 各位的支持和承認,就是我創做的最大動力,咱們下篇文章見!
若是本篇博客有任何錯誤,請批評指教,不勝感激 !
本文來自: 微信公衆號【大數據實戰演練】。閱讀更多精彩好文,歡迎關注微信公衆號【大數據實戰演練】。