Ambari 常用的 REST API 介绍

5.10 Ambari 常用的 REST API 介绍

5.10.1通过 API 卸载已安装的 Service

目前 Ambari 不支持在 GUI 上面卸载已安装的 Service。所以当一个 Service 不再需要的时候,用户没法删除掉该 Service。幸运的是 Ambari 提供了 DELETE 的 Rest API,我们可以通过该 API 来删除 Ambari 中 Service。不过这里需要注意,这个方法只是从 Ambari Service 中删除了 Service。这样一来,Ambari 的 GUI 界面中不再显示这个 Service。但是 Service 本身还安装在 Agent 所在的机器。如果用户需要彻底的清除掉这个 Service,仍需要手工的到每个机器卸载(例如,在每个机器执行 yum erase)。

这里我以删除 Storm 为例。卸载之前,需要确认是否停掉了该 Service。我们通过 GET 方法来得到这个结果(这里当然也可以直接从 GUI 上面看到 Service 状态)。具体的命令如下:

curl -u admin:admin -H "X-Requested-By: ambari" -X GET
   http://zwshen86:8080/api/v1/clusters/bigdata/services/STORM

命令中的 zwshen86 为 Ambari Server 的机器名(端口默认为 8080),bigdata 为 cluster 名字,STORM 为 Service 的名字。

在返回的报文中,可以看到 State 字段。如果是 INSTALLED,代表这个 Service 已经是停掉的状态。我们可以继续删除步骤。如果不是 INSTALLED,则需要先停掉这个 Service,可以从 WEB 上操作,也可以用 Rest API。

图 17. Get 返回的结果


用 Rest API 停掉 Service 的命令格式如下,有兴趣的朋友可以尝试一下。

curl -u admin:admin -H "X-Requested-By: ambari" -X PUT -d '{"RequestInfo":
        {"context":"Stop Service"},"Body":{"ServiceInfo":{"state":"INSTALLED"}}}' 
        http://AMBARI_SERVER_HOST:8080/api/v1/clusters/c1/services/SERVICE_NAME

执行如下命令删除 STORM:

curl -u admin:admin -H "X-Requested-By: ambari" -X
DELETE  http://zwshen86:8080/api/v1/clusters/bigdata/services/STORM

执行完成后,Storm 就从 Ambari 的 Service 里面删掉了,但是 Storm 的 package 还存在于机器。

图 18. Storm 的 RPM 包


如果需要彻底清除掉 Storm 的 package,则需要到各个 Agent 机器执行如下命令。

yum erase“storm_2_2*”

执行完后,这个 Service 就被彻底的清除掉了。

5.10.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

5.10.3通过 API 执行 Service 的命令

这里,我们以调用 API 执行 Service Check 为例。首先需要知道命令的名字,这里每个 Service 的 Check 命令也是不同的。不过 Service Check 是 build-in 的命令,所以有一定的格式可循。

格式大致如下:

 NAME_SERVICE_CHCECK

只要将 NAME 替换成对应的 Service,就是该 Service 的 Check 命令。以 YARN 为例,执行如下的命令。

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://zwshen86:8080/api/v1/clusters/bigdata/requests

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

图 19. Service Check 执行进度


在这里我们可以发现,这个 Operation 的名字其实就是 context 字段的值。我们在 WEB GUI 上面直接点击 Service Check 的时候,Operation 的名字其实是 JS code 中指定了一个特殊 context。

这里我们也可以指定执行自定义命令(Custom Comand)。以给 Resource Manager 添加的 GetMem 为例。执行如下的命令。

curl -u admin:admin -H "X-Requested-By: ambari" -X POST -d '
   {"RequestInfo":{"context":"Get RM host Mem
Usage","command":"GetMem"},"Requests/resource_filters":[{"service_name":
   "YARN","component_name":"RESOURCEMANAGER","hosts":"zwshen86.eng.platformlab.ibm.com"}]}'
   http://zwshen86:8080/api/v1/clusters/bigdata/requests

WEB GUI 的显示如下

图 20. 自定义命令 GetMem 的执行进度


跟 Service Check 相比,不难看出其中的差异。对于自定义命令,我们需要指定参数 Component 以及 Host。当这两个参数缺失的时候,Ambari 是不会接受这个请求的。

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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7490392/viewspace-2084850/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7490392/viewspace-2084850/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ambari API是Apache Ambari提供的REST API,可以用于管理和监控Hadoop集群。以下是使用Ambari API进行调用的一些基本步骤: 1. 构建API URL Ambari API的URL基于以下格式: http://<ambari-server>:<port>/api/v1/<resource>/<resource_id> 其中,<ambari-server>是Ambari服务器的IP地址或主机名,<port>是Ambari服务器的端口号,<resource>是API资源的名称,<resource_id>是要操作的资源的唯一标识符。 2. 发送API请求 可以使用curl或其他HTTP客户端发送API请求。示例代码如下: curl -u <username>:<password> -H "X-Requested-By: ambari" -X GET http://<ambari-server>:<port>/api/v1/clusters/<cluster_name>/services 其中,<username>和<password>是Ambari管理员的用户名和密码,<cluster_name>是要操作的集群的名称,GET表示获取资源列表。 3. 解析API响应 API响应是JSON格式的,可以使用Python、Java等编程语言解析。示例代码如下: import requests import json url = 'http://<ambari-server>:<port>/api/v1/clusters/<cluster_name>/services' headers = {'X-Requested-By': 'ambari'} auth = ('<username>', '<password>') response = requests.get(url, headers=headers, auth=auth) response_json = json.loads(response.text) for service in response_json['items']: print(service['ServiceInfo']['service_name']) 以上是使用Ambari API进行调用的基本步骤。在实际使用中,还可以根据需要添加其他参数和选项,例如过滤器、排序、限制返回字段等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值