您的位置:首页 > 其它

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

2017-10-31 19:04 1746 查看
本文梳理的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[/code] 
注意:安装的组件必须是在服务的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[/code] 
(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[/code] 


在该步操作成功后,可在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
相关文章推荐