Ambari-Server Rest API处理2(Ambari-Server通过Rest API进行服务安装部署操作流程+操作源码分析)
Posted 安然_随心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ambari-Server Rest API处理2(Ambari-Server通过Rest API进行服务安装部署操作流程+操作源码分析)相关的知识,希望对你有一定的参考价值。
本文梳理的Rest API主要是针对Web端的Rest API,暂不包括处理Agent 请求的API.该部分的处理以后会补充。
目录
- 基础知识准备
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 - Ambari-Server 处理Rest API基本流程说明
2.1. 从Server到Handler
2.2. Hander分派
2.3. 具体Handler处理
2.4. 基本流程总结 - 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. 卸载服务 - 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.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,该函数处理过程如下图所示:
@Override
public 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节中描述的服务组件安装处理过程相同。所以,这里就不进行详细说明了。
以上是关于Ambari-Server Rest API处理2(Ambari-Server通过Rest API进行服务安装部署操作流程+操作源码分析)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 AFNetworking 2.0 处理 Parse.com Rest API 错误