前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ambari-server api,多表数据关联

ambari-server api,多表数据关联

作者头像
create17
发布2019-03-15 15:47:21
6220
发布2019-03-15 15:47:21
举报

前文(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

代码语言:javascript
复制
{
    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字段又是另一个表的数据。


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据实战演练 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、得到多表数据
    • 1. QueryImpl.queryForSubResources()
      • 2. populatedQueryResults代表你前面查询获取到的数据
        • 3. QueryImpl.getKeyValueMap()
          • 4. QueryImpl.createPredicate()
            • 5. QueryImpl.doQuery()
              • 6. 返回到QueryImpl.execute(),执行getResult()
                • 7. QueryResult queryResult = queryResults.get(parentResource);
                  • 8. 使用for循环来遍历Rack相关的数据 -- iterResource
                    • 9. 第二个for循环对requestedSubResources进行遍历
                      • 10. 又执行了一遍getResult()方法,
                        • 11. 重中之重
                        • 二、最终效果
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档