Ambari-Server Rest API处理2(Ambari-Server通过Rest API进行服务安装、部署、操作流程+操作源码分析)

来源:互联网 发布:淘宝柯巴 编辑:程序博客网 时间:2024/06/06 00:54

本文梳理的Rest API主要是针对Web端的Rest API,暂不包括处理Agent 请求的API.该部分的处理以后会补充。

目录

  1. 基础知识准备
    1.1. IDEA远程调试Ambari-Server
    1.1.1. 在IDEA中配置远程服务器
    1.1.2. 以Debug模式启动Ambari-Server
    1.1.3. 在IDEA中连接Ambari-Server
    1.2. Rest API 说明
    1.2.1. 使用curl发送Rest API请求
    1.2.2. Ambari-Server中基本的Rest API请求举例
    1.3. Ambari-Server目录
    1.4. Ambari-Server中基本资源对象与Provider
  2. Ambari-Server 处理Rest API基本流程说明
    2.1. 从Server到Handler
    2.2. Hander分派
    2.3. 具体Handler处理
    2.4. 基本流程总结
  3. Ambari-Server通过Rest API进行服务安装、部署、操作流程
    3.1. 服务部署安装流程
    3.2. 关于配置
    3.2.1. 配置相关的Rest API
    3.3. 安装部署时可能遇到的问题
    3.3.1. 安装失败,提示缺少配置
    3.3.2. 重启时,数据库检查不通过,Ambari-Server重启失败
    3.4. 服务操作
    3.4.1. 创建服务
    3.4.2. 启动服务
    3.4.3. 停止服务
    3.4.4. 卸载服务
  4. Ambari-Server通过Rest API进行服务安装、部署、操作源码分析
    4.1. 创建服务资源
    4.2. 为服务添加服务组件
    4.3. 创建配置
    4.4. 应用配置
    4.5. 指定服务组件部署的主机
    4.6. 开始服务组件的安装
    4.6.1. 关于Stage与Stage DAG
    4.6.2. Stage DAG构建逻辑
    4.7. 服务操作
  5. 用户鉴权、操作权限检查管理
    5.1. HTTP基本认证
    5.2. 从Ambari-Server用户基本认证之Servlet Filter
    5.2.1. 关于spring-security.xml
    5.2.2. AmbariUserAuthorizationFilter
    5.2.3. AmbariDelegatingAuthenticationFilter
    5.2.4. AmbariAuthorizationFilter
    5.3. 操作权限检查
    5.4. 用户鉴权检查总结
    5.5. 用户登录
    5.6. 用户登出

第一二章见:
http://blog.csdn.net/youyou1543724847/article/details/78377914

3.Ambari-Server通过Rest API进行服务安装、部署、操作流程

3.1.服务部署安装流程

以Flume服务为例,说明使用Rest API进行服务部署安装步骤。在进行安装部署之前,要确保在Ambari Server节点的相关资源目录下具有待安装部署的服务资源目录。对于Ambari集成了的服务,服务目录在/var/lib/ambari-server/resources/common-services/ServiceName,如果不是Ambari已经集成了的服务,则需要在/var/lib/ambari-server/resources/stacks/HDP/vesion/services目录下创建相关的服务目录,编写相关的服务文件(具体的操作可见“Ambari 自定义服务流程”)。
具体步骤如下:
(1)创建服务资源,在该步骤操作成功之后,登录Ambari,应该能在DashBoard中能看到Flume服务。

API形式为:curl -u admin:admin    -i -H 'X-Requested-By:ambari'    -X POST -d  '{"ServiceInfo":{"service_name":"FLUME"}}'     http://node1:8080/api/v1/clusters/mycluster/services  

这里写图片描述

(2)为服务添加服务组件

curl -u admin:admin    -i -H 'X-Requested-By:ambari'    -X  POST  http://node1:8080/api/v1/clusters/mycluster/services/FLUME/components/FLUME_HANDLER

注意:安装的组件必须是在服务的metainfo.xml文件中配置了的。

(3)创建配置
在配置前,首先需要了解服务是否需要配置、有那些配置类型、每个配置类型有那些配置Key-value对。关于配置问题详情见3.1节。对于FlUME服务来说,需要的配置类型有:flume-conf,flume-env,flume-logsearch-conf,分配为每个配置类型创建一个配置项

创建flume-conf项: curl -u admin:admin  -i -H 'X-Requested-By:ambari'    -X POST -d  '{"type":"flume-conf","tag":"version1","properties":{"content":"# Flume agent config"}}'  http://node1:8080/api/v1/clusters/mycluster/configurations创建flume-env项: curl -u admin:admin  -i -H 'X-Requested-By:ambari'    -X POST -d  '{"type":"flume-env","tag":"version1","properties":{"flume_conf_dir":"/etc/flume/conf", "flume_log_dir":"/var/log/flume","flume_run_dir":"/var/run/flume","flume_user":"flume"}}'  http://node1:8080/api/v1/clusters/mycluster/configurations创建flume-logsearch-conf项: curl -u admin:admin  -i -H 'X-Requested-By:ambari'    -X POST -d  '{"type":"flume-logsearch-conf","tag":"version1","properties":{"service_name":"flume", "component_mappings":"FLUME:flume_handler","content":"Metadata"}}'  http://node1:8080/api/v1/clusters/mycluster/configurations

(4)应用配置
将上述创建的三个配置全部应用到集群上,应用配置的API形式为:
应用flume-conf配置项: curl -u admin:admin -i -H ‘X-Requested-By:ambari’ -X PUT -d ‘{“Clusters”:{“desired_configs”:{“type”:”flume-conf”,”tag”:”version1”}}}’ http://node1:8080/api/v1/clusters/mycluster

应用flume-env配置项: curl -u admin:admin -i -H ‘X-Requested-By:ambari’ -X PUT -d ‘{“Clusters”:{“desired_configs”:{“type”:”flume-env”,”tag”:”version1”}}}’ http://node1:8080/api/v1/clusters/mycluster

应用flume-logsearch-conf配置项: curl -u admin:admin -i -H ‘X-Requested-By:ambari’ -X PUT -d ‘{“Clusters”:{“desired_configs”:{“type”:”flume-logsearch-conf”,”tag”:”version1”}}}’ http://node1:8080/api/v1/clusters/mycluster

(5)指定服务组件部署的主机
将服务组件添加到主机上,注意这一步并没有进行安装,这只在Server中创建了相关了JAX-RS资源。这里这在集群中的一个节点上部署了一个服务组件。在实际的操作时,可能需要部署多个服务组件,并将服务组件部署到多个主机节点上。

curl -u admin:admin    -i -H 'X-Requested-By:ambari'    -X  POST   http://node1:8080/api/v1/clusters/mycluster/hosts/node1/host_components/FLUME_HANDLER

这里写图片描述

在该步操作成功后,可在Ambari管理界面中相关主机界面看到相关的服务组件,但是服务组件的状态是“Install Pending….”。

这里写图片描述

(6)开始服务组件的安装
这一步进行服务组件的真正安装,在该部完成后,可在Ambari管理界面看到Flume服务,且看到一个安装操作正在进行。在安装时,可以通过两张形式完成:一是直接安装服务相关的所有主机上的服务组件;二是对单个主机进行安装。这里只说明第一种方式

:curl -u admin:admin    -i -H 'X-Requested-By:ambari'    -X  PUT  http://node1:8080/api/v1/clusters/mycluster/services/FLUME  -d '{"RequestInfo": { "context": "Install flue"},"Body": { "ServiceInfo": { "state": "INSTALLED"}   }}'

操作成功后,能在Web页面有一个操作正在执行,如下所示。

这里写图片描述

(7)启动服务
API形式为: curl -u admin:admin -i -H ‘X-Requested-By:ambari’ -X PUT -d ‘{“RequestInfo”:{“context”:”Start FLUME via REST”}, “Body” : {“ServiceInfo” : {“state”:”STARTED”}}}’ http://node1:8080/api/v1/clusters/mycluster/services/ FLUME
启动操作完成后的状态如下:
这里写图片描述

3.2.关于配置
配置是key-value形式的集合,持久化保存在Ambari Server中。一个配置由配置类型、版本标记、属性三部分组成,例如:

{  "type": "core-site",  "tag": "version1",  "properties": {    "fs.default.name": "hdfs://h0:8020"    // ...}}

配置类型指明了配置的含义,一个配置由配置类型和版本标识唯一标识。在Ambari中,同配置类型、版本的配置只能有一个,但是允许有多个版本号不同的同一配置类型的配置。

3.2.1.配置相关的Rest API

(1)获取集群中的所有配置

GET /api/v1/clusters/mycluster/configurations{  "items" : [    {      "tag" : "version1",      "type" : "global",      "Config" : {        "cluster_name" : "c1"      }    },    /* etc */  ]}

如果需要显示每个配置中的属性对,可加上配置类型和版本请求参数

GET /api/v1/clusters/c1/configurations?type=global&tag=version1{  "items" : [  {    "tag" : "version1",    "type" : "global",    "Config" : {      "cluster_name" : "c1"    },    "properties" : {      "hdfs_enable_shortcircuit_skipchecksum" : "false",      "hive_lib" : "/usr/lib/hive/lib/",      /* etc */    }  ]}}

(2)创建配置

POST /api/v1/clusters/c1/configurations{  "tag" : "version2",  "type" : "global",  "Config" : {    "cluster_name" : "c2"  }}

(3)应用配置(设置集群的desired config),下面操作前需要前创建配置:

PUT /api/v1/clusters/c1{  "Clusters": {    "desired_config": {      "type": "core-site",      "tag": "version2"    }  }}

另外,你可以创建配置、应用配置一步到位:

PUT /api/v1/clusters/c1{  "Clusters": {    "desired_config": {      "type": "core-site",      "tag": "version2",      "properties": {        "a": "b",        /* etc */      }    }  }}

(4)列举某个主机上的所有desired配置

GET /api/v1/clusters/c1/hosts/h0{  "Hosts" : {    "cluster_name" : "c1",    "host_name" : "h0",    "desired_configs" : {      "global" : {        "overrides" : {          "2" : "version10"        },        "default" : "version1"      },      /* etc */    }  }}

(5)例举集群中的所有的Desired配置

GET /api/v1/clusters/c1{  "Clusters" : {    "cluster_name" : "c1",     "cluster_id" : 2,     "desired_configs" : {       "global" : {         "tag" : "version1"       },       "hdfs-site" : {         "tag" : "version1"       },       "core-site": {         "tag": "version1"       },        /* etc */     }   }}

(6)关于actual配置
Actual配置为集群中目前应用的配置。当修改应用的配置时,首先将配置保存到Server的后端数据库中,这时,可能主机可能还没有收到配置改变的消息。当主机收到配置变更的消息,并将desired配置真正应用时,desired配置变成actual配置。当host的actual配置和desire配置不同时,这是服务就需要重启将配置应用上去。

3.3.安装部署时可能遇到的问题

3.3.1.安装失败,提示缺少配置

当Host安装服务组件时,安装失败,查看操作日志,显示“raize Fail (“Configuration parameter + self.name + was not found in configurations dictionary!”) ”
比如,安装HBase时,配置不全,则安装失败,操作日志如下图所示。
这里写图片描述

错误原因:创建应用的配置类型property属性不全。在创建配置类型时,需要对相应配置文件中的所有property标签下的属性进行配置。如对于配置类型flume-env,对应于服务目录下的flume-env.xml文件,对该xml文件中的所有property进行设置,包括flume_conf_dir,flume_log_dir,flume_run_dir,lume_user。
解决办法:重新创建一个信息齐全的配置类型并应用上去。

3.3.2.重启时,数据库检查不通过,Ambari-Server重启失败

主机节点在完成安装后,安装成功,但是当停止Ambari-Server服务进行重启时,Ambari-Server重启失败,提示“Error:Exiting with exit code 1. Reason:Db configs consistency check error…..”,查看数据库检测日志,发现Error:” ERROR - Required config(s):** is(are) not available for service Flume with service config version 2 in cluster mycluster”。
数据库检查结果日志如下图所示。
这里写图片描述

错误原因:服务目录下的configuration文件夹下的所有的xml文件都对应一个配置类型,都需要在配置并应用。可能里面的xml文件所进行的配置服务并不一定会用到(服务运行也不依赖于这些配置),但是当Ambari-Server进行正常启动时,都会检测相关服务下的配置是否建立齐全。
解决办法:
方法一:首先以–skip-database-check模式启动Ambari-Server,然后创建相应的配置类型并应用上去。

方法二:直接以–skip-database-check模式启动Ambari-Server(如果确定服务不依赖这些配置项的化)或是删除configuration目录下的相关xml文件。

3.4.服务操作

服务操作包括启动服务、停止服务、服务重启、服务卸载、服务检查、服务自定义命令等。

3.4.1.创建服务

请求(创建HDFS服务):POST /clusters/c1/services/HDFS
响应:201 Created

3.4.2.启动服务

请求(启动HDFS服务):PUT /clusters/c1/services/HDFS/

Body{  "ServiceInfo": {    "state" : "STARTED"  }}

响应:

202 Accepted{  "href" : "http://your.ambari.server/api/v1/clusters/c1/requests/3",  "Requests" : {    "id" : 3,    "status" : "InProgress"  } }

3.4.3.停止服务
请求(启动HDFS服务):PUT /clusters/c1/services/HDFS/

Body{  "ServiceInfo": {    "state" : "INSTALLED"  }}

响应:202 Accepted
启动和停止操作类似,知识传入的Body中的state参数不同,一个为“Started”,一个为“Installed”。
服务所有可能的状态如下:
这里写图片描述

3.4.4.卸载服务

请求(卸载HDFS服务):DELETE: /clusters/c1/services/HDFS/
响应:200 OK
注意:在卸载服务前,需要停止服务。

4.Ambari-Server通过Rest API进行服务安装、部署、操作源码分析

Ambari-Server对服务安装、部署、操作请求的处理过程如同2.4所述。在Server解析请求、HanlderList分配路径请求、Handler分解原始请求、BaseRequest解析子请求这几步都是通用的。但是对于不同类型的请求,对应的请求Handler不同,也就是从图紫色框所示的地方开始处理开始不同。下面都不同类型的请求,说明不同的RequestHandler对Request的处理。
这里写图片描述

不同的Request的Handler的类UML图关系如下:

这里写图片描述

4.1.创建服务资源
使用curl发出Rest请求,追踪请求的处理过程:curl -u admin:admin -i -H ‘X-Requested-By:ambari’ -X POST -d ‘{“ServiceInfo”:{“service_name”:”FLUME”}}’ http://node1:8080/api/v1/clusters/mycluster/services

该请求对应的Jetty Handler为ServiceService,对应的处理方法为createService。该请求对应的子Request对应的Handler为CreateHandler。
对于CreateHandler.handleRquest方法,直接调用BaseManagement.handleRequest,该函数处理过程如下图所示:

@Overridepublic Result handleRequest(Request request) {  Query query = request.getResource().getQuery();  Predicate queryPredicate = request.getQueryPredicate();  query.setRenderer(request.getRenderer());  if (queryPredicate != null) {    query.setUserPredicate(queryPredicate);  }  return persist(request.getResource(), request.getBody());}

对于BaseManagement.handleRequest函数,前面几行代码主要是对请求的参数进行一些处理,这里主要关注persist方法,该方法会对request进行真正的处理。对于不同的子Handler,只要实现persist方法,进行不同的处理。
对于CreateHandler的persist方法,主要处理是通过PersistenceManager进行后续处理。PersistenceManager的实现类为PersistenceManagerImp( org.apache.ambari.server.api.services.persistence)。具体处理步骤如下图所示。

这里写图片描述

上图中集群控制器ClusterController的实现类为ClusterControllerImpl,类目录org.apache.ambari.server.controller.internal。PersistenceManager通过调用ClusterController的createResources方法创建资源。
常用的Provider类UML图如下所示。
这里写图片描述

AbstrackAuthorizedResourceProvider的createResource方法主要操作流程如下图所示。其中:
在provider进行验证请求的正确性时,验证检测项包括:请求的目标集群参数、服务名参数是否为空;请求的目标集群是否存在;目标集群是否已经安装了该服务;在stack/HDP/Version/services目录下是否存在相应服务目录;是否请求了多个集群(不允许同时对多个集群进行更新操作);

这里写图片描述

创建服务的总体操作流程如下所示(从CreateHandler开始)。

这里写图片描述

4.2.为服务添加服务组件

使用curl发出Rest请求,追踪请求的处理过程:curl -u admin:admin -i -H ‘X-Requested-By:ambari’ -X POST http://node1:8080/api/v1/clusters/mycluster/services/FLUME/components/FLUME_HANDLER
该请求对应的Jetty Handler为ComponentService,对应的处理方法为createComponent。该请求对应的子Request对应的Handler为CreateHandler。该请求的Request Handler同创建服务资源的Handler相同,也就是说该请求处理的主体流程和4.1说描述的相同,不同的是该请求的Provider子类不同。该请求的处理过程如下图所示。
这里写图片描述

下面主要对ComponentResourceProvider.createComponents方法进行分析,该方法的处理过程如下图所示。

这里写图片描述

在校验通过后,实际的组件添加操作过程如下图所示:
这里写图片描述

4.3.创建配置

使用curl发出Rest请求,追踪请求的处理过程:
创建flume-conf项: curl -u admin:admin -i -H ‘X-Requested-By:ambari’ -X POST -d ‘{“type”:”flume-conf”,”tag”:”version1”,”properties”:{“content”:”# Flume agent config”}}’ http://node1:8080/api/v1/clusters/mycluster/configurations
该请求对应的Jetty Handler为ConfigurationService,对应的处理方法为createConfigurations。该请求对应的子Request对应的Handler为CreateHandler。该请求的Request Handler同创建服务资源的Handler相同,也就是说该请求处理的主体流程和4.1说描述的相同,不同的是该请求的Provider子类不同。该请求的处理过程如下图所示。
这里写图片描述

配置资源的ConfigurationResourceProvider和上述的资源Provider(如ServiceResourceProvider、ComponentResourceProvider)不同,该ConfigurationResourceProvider不进行实际的Configuration的管理,而是在进行初步处理后,调用AmbariManagementControllerImpl进行Configuration的实际创建工作。下面主要讲述AmbariManagementControllerImpl的createConfiguration的处理流程,处理过程如下图所示。

这里写图片描述

4.4.应用配置

使用curl发出Rest请求,追踪请求的处理过程:curl -u admin:admin -i -H ‘X-Requested-By:ambari’ -X PUT -d ‘{“Clusters”:{“desired_configs”:{“type”:”flume-conf”,”tag”:”version1”}}}’ http://node1:8080/api/v1/clusters/mycluster
该请求对应的Jetty Handler为ClusterService,对应的处理方法为updatecluster。该请求对应的子Request对应的Handler为UpdateHandler。该请求处理的主体流程如下图所示。

这里写图片描述

对于AmbariManagementControllerImpl的updateCluster方法的处理流程如下所示:
① 获取请求的目标集群;
② 检查用户是否具有更新集群的权限;
③ 检查请求参数:是否在设置desired config的同时同时设置了config回滚;
④ 处理目标config的properties集合中的类型为PASSWORD的property;
⑤ 创建集群配置映射;
⑥ 创建响应;
⑦ 根据请求和响应,更新集群状态(状态的更新是将请求响应放入到一个ClusterUpdateCache中,对该cache的后续处理没有看);
⑧ 返回响应。

4.5.指定服务组件部署的主机

使用curl发出Rest请求,追踪请求的处理过程:curl -u admin:admin -i -H ‘X-Requested-By:ambari’ -X POST http://node1:8080/api/v1/clusters/mycluster/hosts/node1/host_components/FLUME_HANDLER
该请求对应的Jetty Handler为HostService,对应的处理方法为createHostComponent。该请求对应的子Request对应的Handler为CreateHandler。
该请求的Request Handler同创建服务资源的Handler相同,也就是说该请求处理的主体流程和4.1说描述的相同,不同的是该请求的Provider子类不同。该请求的处理过程如下图所示。
这里写图片描述

AmbariManagementControllerImpl的createHostComponents函数的处理过程如下图所示。其中对于每个请求所做的检验包括:
a)请求信息是否齐全;
b)请求的target cluster是否存在;
c)用户使用有权限部署服务组件;
d)根据reques的component栈初始化

"HIVE_SERVER-START": [ "HIVE_METADATA_DATABASE-START" ],

也可以是不同service间的不同component,比如:

"KAFKA_MANAGER-START": [ "ZOOKEEPER_SERVER-START" ],

再比如有service的metainfo.xml这个配置文件给定的规则,规定了service间的依赖关系:

<requiredServices> <service>YARN</service> <service>HIVE</service><service>HDFS</service> </requiredServices>

这里要明确的是Ambari中有两种DAG :
① Stage间的DAG:根据nodes建立Stage DAG,即不同Stage的DAG;
② Stage内部的DAG:根据给定Stage内部的nodes建立Task DAG,即不同Command的DAG;

4.7.服务操作

这里以停止服务为例,说明服务操作的主要处理流程。
使用curl发出Rest请求,追踪请求的处理过程:curl -u admin:admin -i -H ‘X-Requested-By:ambari’ -X PUT -d ‘{“RequestInfo”:{“context”:”Stop FLUME via REST”}, “Body” : {“ServiceInfo” : {“state”:”INSTALLED”}}}’ http://node1:8080/api/v1/clusters/mycluster/services/ FLUME

该请求对应的Jetty Handler为ServiceService,对应的处理方法为updateService。该请求对应的子Request对应的Handler为UpdateHandler。该请求的处理过程和4.6节中描述的服务组件安装处理过程相同。所以,这里就不进行详细说明了。