ambari-server api,多表數據關聯

前文(Ambari-server開發自定義api)提到ambari-server自定義api,來獲取一個表的信息。html

如今有一個需求,就是製做一個api,獲取兩個表的信息。這兩個表中的數據是經過一個字段值是否一致來判斷是否關聯在一塊兒的。java

下文會根據每一個方法的做用進行說明,沒有ambari-server後臺開發的經驗看起來可能會有些吃力,建議仍是多debug後臺代碼,該文僅做參考。node

下面以ambari數據表rackshosts表爲例,製做的一條get類型的api,其中根據racks表中的rack_name字段值和hosts表中的rack_info字段值判斷數據是否關聯。git

1、獲得多表數據

<!--more-->github

1. QueryImpl.queryForSubResources()

其中requestedSubResources的值是在對應Type的ResourceDefinition類中定義,例如RackResourceDefinition.javaapache

對應的RackHostResourceDefinition.javajson

這樣的話,requestedSubResources就有值了centos

2. populatedQueryResults表明你前面查詢獲取到的數據
3. QueryImpl.getKeyValueMap()

4. QueryImpl.createPredicate()

5. QueryImpl.doQuery()

獲取的另外一個表中的數據api

6. 返回到QueryImpl.execute(),執行getResult()

這裏面最重要的就是兩個for循環,由兩個for循環來判斷子資源是否內嵌到父資源內微信

7. QueryResult queryResult = queryResults.get(parentResource);
  • queryResultqueryResponse表明Rack相關數據
  • 這個方法裏面也有相關分頁,排序的操做(分頁和排序功能沒有深刻研究
8. 使用for循環來遍歷Rack相關的數據 -- iterResource

9. 第二個for循環對requestedSubResources進行遍歷

10. 又執行了一遍getResult()方法,

TreeNode<Resource> childResult = subResource.getResult(resource).getResultTree();

QueryResult queryResult = queryResults.get(parentResource);

這裏獲得結果的queryResponse就是子數據了

11. 重中之重

會根據ClusterControllerImpl.getNextResource()來獲取下一個資源,若是這裏判斷爲null,進而判斷爲false,則不會進入for循環,進而會退出二次迭代,而後子數據就沒有了。這也是多表數據關聯的最重要的一步。

是在**QueryImpl.getResult()**裏面進行操做的。要特別注意。

ClusterControllerImpl.getNextResource() ---> .evaluate() ---> org.apache.ambari.server.controller.predicate.**EqualsPredicate.evaluate()**來做判斷。

這兩個的keyPropertyIds須要對比,必須只有Resource.Type.Rack相同,不然predicate的值就會有變化,進而致使兩個表的數據沒法進行關聯匹配。

org/apache/ambari/server/controller/internal/RackResourceProvider.java

org/apache/ambari/server/controller/internal/RackHostResourceProvider.java

2、最終效果

請求方式:http://ip:8080/api/v1/racks?fields=rack_hosts

請求類型:GET

{
    href: "http://ip:8080/api/v1/racks?fields=rack_hosts",
    items: [
        {
            href: "http://ip:8080/api/v1/racks/%2Frack1",
            rack: {
                rack_description: "",
                rack_height: "42",
                rack_id: 1,
                rack_location: "",
                rack_name: "/rack1",
                rack_type: "Defalut"
            },
            rack_hosts: [
                {
                    href: "http://ip:8080/api/v1/racks/%2Frack1/rack_hosts/node1.ambari",
                    Host: {
                        cpu_count: 2,
                        disk_info: [
                            {
                                available: "40661924",
                                device: "/dev/sda3",
                                used: "80735412",
                                percent: "67%",
                                size: "121397336",
                                type: "xfs",
                                mountpoint: "/"
                            }
                        ],
                        host_height: "2",
                        host_location: "41",
                        host_name: "node1.ambari",
                        host_status: "HEALTHY",
                        host_type: "default",
                        ip: "ip",
                        maintenance_state: "OFF",
                        os_type: "centos7",
                        ph_cpu_count: 2,
                        public_host_name: "node1.ambari",
                        rack_info: "/rack1",
                        total_mem: 7994320
                    }
                }
            ]
        },
        {
            href: "http://ip:8080/api/v1/racks/%2Frack2",
            rack: {
                rack_description: "",
                rack_height: "42",
                rack_id: 2,
                rack_location: "",
                rack_name: "/rack2",
                rack_type: "Defalut"
            },
            rack_hosts: [
                
            ]
        }
    ]
}

其中rack字段是一個表的數據,rack_hosts字段又是另外一個表的數據。


點關注,不迷路

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

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

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

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

相關文章
相關標籤/搜索