• Ambari 常用的 REST API 介绍


    源码文档路径:ambariambari-serverdocsapiv1

    swagger风格api文档:https://www.cnblogs.com/felixzh/p/10694724.html

    Ambari 借鉴了很多成熟分布式软件的 API 设计。Rest API 就是一个很好地体现。通过 Ambari 的 Rest API,可以在脚本中通过 curl 维护整个集群。
    并且,我们可以用 Rest API 实现一些无法在 Ambari GUI 上面做的操作。下面是一些实例。

    查询关于集群信息

    [root@hadron ~]#curl -H "X-Requested-By: ambari" -X GET -u admin:admin http://192.168.1.25:8080/api/v1/clusters
    {
      "href" : "http://192.168.1.25:8080/api/v1/clusters",
      "items" : [
        {
          "href" : "http://192.168.1.25:8080/api/v1/clusters/cc",
          "Clusters" : {
            "cluster_name" : "cc",
            "version" : "HDP-2.5"
          }
        }
      ]
    }

    查询集群主机信息

    [root@hadron ~]# curl -u admin:admin http://192.168.1.25:8080/api/v1/hosts
    {
      "href" : "http://192.168.1.25:8080/api/v1/hosts",
      "items" : [
        {
          "href" : "http://192.168.1.25:8080/api/v1/hosts/anode1",
          "Hosts" : {
            "cluster_name" : "cc",
            "host_name" : "anode1"
          }
        },
        {
          "href" : "http://192.168.1.25:8080/api/v1/hosts/anode2",
          "Hosts" : {
            "cluster_name" : "cc",
            "host_name" : "anode2"
          }
        },
        {
          "href" : "http://192.168.1.25:8080/api/v1/hosts/anode3",
          "Hosts" : {
            "cluster_name" : "cc",
            "host_name" : "anode3"
          }
        }
      ]
    }


    例1,通过 API 卸载已安装的 Service
     Ambari 提供了 DELETE 的 Rest API,我们可以通过该 API 来删除 Ambari 中 Service。

    不过这里需要注意,这个方法只是从 Ambari Service 中删除了 Service。这样一来,Ambari 的 GUI 界面中不再显示这个 Service。

    但是 Service 本身还安装在 Agent 所在的机器。如果用户需要彻底的清除掉这个 Service,仍需要手工的到每个机器卸载(例如,在每个机器执行 yum erase)。
    这里我以删除 Hbase为例。卸载之前,需要确认是否停掉了该 Service。
    我们通过 GET 方法来得到这个结果(这里当然也可以直接从 GUI 上面看到 Service 状态)。
    具体的命令如下: 

    [root@hadron ~]# curl -u admin:admin -H “X-Requested-By: ambari” -X GET http://192.168.1.25:8080/api/v1/clusters/cc/services/HBASE

    停止服务

    [root@hadron ~]# curl -u admin:admin -H "X-Requested-By: ambari" -X PUT -d 
    > '{"RequestInfo":{"context":"Stop Service"},"Body":{"ServiceInfo":{"state":"INSTALLED"}}}'
    > 192.168.1.25:8080/api/v1/clusters/cc/services/HBASE

    删除服务

    [root@hadron ~]# curl -u admin:admin -H "X-Requested-By: ambari" -X 
    > DELETE http://192.168.1.25:8080/api/v1/clusters/cc/services/HBASE

    执行完成后,HBASE就从Ambari的Service里面删掉了,但是HBASE的package还存在于机器
    如果需要彻底清除掉HBASE的 package,则需要到各个 Agent 机器执行如下命令。
    yum erase “hbase_2_5*”
    执行完后,这个 Service 就被彻底的清除掉了。

    例 2,获取 Service 的 Component 和 Host 列表
    上个实例中,让用户登录到每个机器去执行 yum 卸载安装包,其实是不太现实的。
    一般我们会写一个脚本先通过 curl 调用 GET 方法,先获取到 Service 的 Component 列表,
    然后再调用 GET 方法,获取 Component 的机器列表,接着调用 DELETE 从 Ambari 中删除 Service。
    最后脚本通过 SSH 登录到各个 Agent 机器上执行 yum 卸载安装包。
    脚本示例代码如下(该脚本只能在 Ambari Server 上执行,
    因为 Ambari Server 有无密码登录所有 Agent 机器的权限)。

    #!/bin/sh
    GetHostList()
    {
     curl -u admin:admin -H "X-Requested-By: ambari" -X GET
     http://$AMBARI_HOST:8080/api/v1/clusters/$CLUSTER/services/$SERVICE/components/$1
     2>/dev/null |grep host_name|awk -F: '{print $2}'|sed 's/"//g' >> temp_host_list
    }
    
    GetServiceComponent()
    {
     curl -u admin:admin -H "X-Requested-By: ambari" -X GET
     http://$AMBARI_HOST:8080/api/v1/clusters/$CLUSTER/services/$SERVICE
     2>/dev/null | grep "component_name" > ./temp_component_list
     sed -i 's/"//g' ./temp_component_list
     sed -i 's/,//g' ./temp_component_list
    }
    
    
    if [ $# != 4 ]; then
     echo "Usage: $0 Ambari_Server Cluster_Name Service_Name Package_Name"
     exit 1
    fi
    
    AMBARI_HOST=$1
    CLUSTER=$2
    SERVICE=$3
    PACKAGE=$4
    
    GetServiceComponent
    
    cat ./temp_component_list|while read line
    do
     COMPONENT=`echo $line|awk -F: '{print $2}'`
     GetHostList $COMPONENT
    done
    
    curl -u admin:admin -H "X-Requested-By: ambari" -X DELETE
    http://$AMBARI_HOST:8080/api/v1/clusters/$CLUSTER/services/$SERVICE
    
    rm -f ./temp_component_list >/dev/null 2>&1
    #delete duplicated lines (duplicated host name)
    
    hosts=`cat temp_host_list|sort |uniq`
    for host in $hosts
    do
     ssh $host "yum erase $PACKAGE"
    done
    
    rm -f temp_host_list >/dev/null 2>&1

    例 3,通过 API 执行 Service 的命令
    这里,我们以调用 API 执行 Service Check 为例。
    首先需要知道命令的名字,这里每个 Service 的 Check 命令也是不同的。
    不过 Service Check 是 build-in 的命令,所以有一定的格式可循。
    格式大致如下:
    NAME_SERVICE_CHCECK
    只要将 NAME 替换成对应的 Service,就是该 Service 的 Check 命令。以 YARN 为例,执行如下的命令。

    [root@hadron ~]# curl -u admin:admin -H "X-Requested-By: ambari" -X POST -d 
    > '{"RequestInfo":{"context":"My YARN Service Check", "command":"YARN_SERVICE_CHECK"},"Requests/resource_filters":[{"service_name":"YARN"}]}' 
    > http://192.168.1.25:8080/api/v1/clusters/cc/requests
    {
      "href" : "http://192.168.1.25:8080/api/v1/clusters/cc/requests/57",
      "Requests" : {
        "id" : 57,
        "status" : "Accepted"
      }
    }

    执行完后,可以发现在 WEB GUI 上面,就多了一个正在进行的 Operation

    小结
    通过这三个简单实例,就可以体会到 Ambari Rest API 的作用。
    在 Rest API 的基础上,就算脱离了 WEB,我们也可以很好地控制 Ambari。
    当然,我们也不得不记住很多生涩的参数。
    因此,大多情况下,只有当 Ambari 的 GUI 不足以完成需求,或者不期望暴露在 GUI 上面的时候,
    就可以使用 Rest API。有兴趣的读者可以搜索下 Ambari Server 目录所有的 Python 脚本,
    其实 Ambari 自身很多地方都在用 curl 调用 Rest API。

  • 相关阅读:
    Jenkins学习总结(1)——Jenkins详细安装与构建部署使用教程
    Maven学习总结(17)——深入理解maven灵活的构建
    Maven学习总结(16)——深入理解maven生命周期和插件
    Maven学习总结(16)——深入理解maven生命周期和插件
    DB2学习总结(1)——DB2数据库基础入门
    DB2学习总结(1)——DB2数据库基础入门
    Java基础学习总结(51)——JAVA分层理解
    关于人生的
    【鲲鹏来了】华为云鲲鹏弹性云服务器 KC1一文全掌握(2)
    华为云文字识别服务产品优势、应用场景、典型案例和未来之路(OCR系列三)
  • 原文地址:https://www.cnblogs.com/felixzh/p/10710204.html
Copyright © 2020-2023  润新知