ambari-server api,多表数据关联

前文(Ambari-server开发自定义api)提到ambari-server自定义api,来获取一个表的信息。

现在有一个需求,就是制作一个api,获取两个表的信息。这两个表中的数据是通过一个字段值是否一致来判断是否关联在一起的。

下文会根据每个方法的作用进行说明,没有ambari-server后台开发的经验看起来可能会有些吃力,建议还是多debug后台代码,该文仅作参考。

下面以ambari数据表rackshosts表为例,制作的一条get类型的api,其中根据racks表中的rackname字段值和hosts表中的rackinfo字段值判断数据是否关联。

一、得到多表数据

1. QueryImpl.queryForSubResources()

其中requestedSubResources的值是在对应Type的ResourceDefinition类中定义,例如RackResourceDefinition.java

对应的RackHostResourceDefinition.java

这样的话,requestedSubResources就有值了

2. populatedQueryResults代表你前面查询获取到的数据

3. QueryImpl.getKeyValueMap()

4. QueryImpl.createPredicate()

5. QueryImpl.doQuery()

获取的另一个表中的数据

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

这里面最重要的就是两个for循环,由两个for循环来判断子资源是否内嵌到父资源内

7. QueryResult queryResult = queryResults.get(parentResource);

  • queryResultqueryResponse代表Rack相关数据
  • 这个方法里面也有相关分页,排序的操作(分页和排序功能没有深入研究
8. 使用for循环来遍历Rack相关的数据 -- iterResource

9. 第二个for循环对requestedSubResources进行遍历

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

TreeNode 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

二、最终效果

请求方式: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//rack1",
            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//rack1/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//rack2",
            rack: {
                rack_description: "",
                rack_height: "42",
                rack_id: 2,
                rack_location: "",
                rack_name: "/rack2",
                rack_type: "Defalut"
            },
            rack_hosts: [
                
            ]
        }
    ]
}

其中rack字段是一个表的数据,rack_hosts字段又是另一个表的数据。

点关注,不迷路

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

create17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值