概述
1、Ambari project
1.1、基本概念
-
Resource:Ambari把可以被管理的资源的抽象为一个Resource实例,资源可以包括服务、组件、主机节点等,一个resource实例中包含了一系列该资源的属性;
-
Property:服务组件的指标名称;
-
ResourceProvider和PropertyProvider分别对应Resource和Property的提供方,获取指标需要先获取Resource,然后获取Property对应的metric;
-
Query:Query是Resource的内部对象,代表了对该资源的操作;
-
Request:一个Request代表了对Resource的操作请求,包含http信息及要操作的Resource的实例,Request按照http的请求方式分为四种:GET、PUT、DELETE、POST;
-
Predicate:一个Predicate代表了一系列表达式,如and、or等;
1.2、源码项目模块
module | description |
---|---|
ambari-server | Ambari的Server程序,主要管理部署在每个节点上的管理监控程序 |
Ambari-agent | 部署在监控节点上运行的管理监控程序 |
Contrib | 自定义第三方库 |
ambari-web | Ambari页面UI的代码,作为用户与Ambari server交互的。 |
ambari-views | 用于扩展Ambari Web UI中的框架 |
Docs | 文档 |
ambari-common | Ambari-server 和Ambari-agent 共用的代码 |
2、Ambari Modules
2.1、Ambari-Server
2.1.1、架构
-
对外,Ambarii-Server提供ambari web,rest api,ambari shell三大方式操作机群;
-
ambari将集群的配置、各个服务的配置等信息存在ambari server端的DB中(比如可以是postgresql);
-
ambari server与ambari agent的交流走RPC,即agent向server报告心跳,server将command通过respons发回给agent,agent本地执行命令,比如:agent端执行相应的python脚本;
-
ambari有自己的一套监控、告警、镜像服务,以可插拔的形式供上层服务调用;
Ambari-Server是一个WEB Server,提供统一的REST API接口,同时向web和agent开放了两个不同的端口(默认前者是8080, 后者是8440或者8441)。它是由Jetty Server容器构建起来的,通过Spring Framework构建出来的WEB服务器,其中大量采用了google提供的Guice注解完成spring框架所需要的注入功能(想一想,之前spring框架需要加载一个applicationcontext.xml文件来把bean注入进来,现在可以用Guice注解的方式就可以轻松完成)。 REST框架由JAX-RS标准来构建。
如下图所示,server端主要维护三类状态:
-
Live Cluster State:集群现有状态,各个节点汇报上来的状态信息会更改该状态;
-
Desired State:用户希望该节点所处状态,是用户在页面进行了一系列的操作,需要更改某些服务的状态,这些状态还没有在节点上产生作用;
-
Action State:操作状态,是状态改变时的请求状态,也可以看作是一种中间状态,这种状态可以辅助Live Cluster State向Desired State状态转变。
Ambari-server的Heartbeat Handler模块用于接收各个agent的心跳请求(心跳请求里面主要包含两类信息:节点状态信息和返回的操作结果),把节点状态信息传递给FSM状态机去维护着该节点的状态,并且把返回的操作结果信息返回给Action Manager去做进一步的处理。
Coordinator模块又可以称为API handler,主要在接收WEB端操作请求后,会检查它是否符合要求,stage planner分解成一组操作,最后提供给Action Manager去完成执行操作
因此,从上图就可以看出,Ambari-Server的所有状态信息的维护和变更都会记录在数据库中,用户做一些更改服务的操作都会在数据库上做一些相应的记录,同时,agent通过心跳来获得数据库的变更历史。
Ambari Server 会读取 Stack 和 Service 的配置文件。当用 Ambari 创建集群的时候,Ambari Server 传送 Stack 和 Service 的配置文件以及 Service 生命周期的控制脚本到 Ambari Agent。Agent 拿到配置文件后,会下载安装公共源里软件包(Redhat,就是使用 yum 服务)。安装完成后,Ambari Server 会通知 Agent 去启动 Service。之后 Ambari Server 会定期发送命令到 Agent 检查 Service 的状态,Agent 上报给 Server,并呈现在 Ambari 的 GUI 上。
Ambari Server 支持 Rest API,这样可以很容易的扩展和定制化 Ambari。甚至于不用登陆 Ambari 的 GUI,只需要在命令行通过 curl 就可以控制 Ambari,以及控制 Hadoop 的 cluster。
2.1.2、目录
目录 | 描述 |
---|---|
org.apache.ambari.server.api.services | 对web接口的入口方法,处理/api/v1/* 的请求 |
org.apache.ambari.server.controller | 对Ambari中cluster的管理处理,如新增host,更service、删除component等 |
org.apache.ambari.server.controller.internal | 主要存放ResourceProvider和PropertyProvider; |
org.apache.ambari.service.orm.* | 对数据库的操作 |
org.apache.ambari.server.agent.rest | 处理与Agent的接口的入口方法 |
org.apache.ambari.security | 使用Spring Security来做权限管理 |
其中,每一种Resource都对应一个ResourceProvider,对应关系如下
Resource.Type | ResourceProvider |
---|---|
Workflow | WorkflowResourceProvider |
Job | JobResourceProvider |
TaskAttempt | TaskAttemptResourceProvider |
View | ViewResourceProvider |
ViewInstance | ViewInstanceResourceProvider |
Blueprint | BlueprintResourceProvider |
Cluster | ClusterResourceProvider |
Service | ServiceResourceProvider |
Component | ComponentResourceProvider |
Host | HostResourceProvider |
HostComponent | HostComponentResourceProvider |
Configuration | ConfigurationResourceProvider |
Action | ActionResourceProvider |
Request | RequestResourceProvider |
Task | TaskResourceProvider |
User | UserResourceProvider |
Stack | StackResourceProvider |
StackVersion | StackVersionResourceProvider |
StackService | StackServiceResourceProvider |
StackServiceComponent | StackServiceComponentResourceProvider |
StackConfiguration | StackConfigurationResourceProvider |
OperatingSystem | OperatingSystemResourceProvider |
Repository | RepositoryResourceProvider |
RootService | RootServiceResourceProvider |
RootServiceComponent | RootServiceComponentResourceProvider |
RootServiceHostComponent | RootServiceHostComponentResourceProvider |
ConfigGroup | ConfigGroupResourceProvider |
RequestSchedule | RequestScheduleResourceProvider |
2.1.3、ambari-server技术栈
Server code: Java 1.7 / 1.8
Agent scripts: Python
Database: Postgres, Oracle, MySQL
ORM: EclipseLink
Security: Spring Security with remote LDAP integration and local database
REST server: Jersey (JAX-RS)
Dependency Injection: Guice
Unit Testing: JUnit
Mocks: EasyMock
Configuration management: Python
2.2、Ambari-Agent
2.2.1、Ambari-agent功能划分
ambari-agent是一个无状态的。其功能主要分两部分:
- 采集所在节点的信息并且汇总发心跳汇报给ambari-server;
- 处理ambari-server的执行请求。
因此它有两种队列:
- 消息队列MessageQueue,或为ResultQueue。包括节点状态信息(包括注册信息)和执行结果信息,并且汇总后通过心跳发送给ambari-server;
- 操作队列ActionQueue。用于接收ambari-server返回过来的状态操作,然后能过执行器按序调用puppet或python脚本等模块完成任务。
2.2.2、Ambari-agent引导流程
分别是用SSH和人工手动的非SSH
步骤:
- Ambari Server通过调用bootstrap.py来初始化整个bootstrap进程
- Server端通过SSH Keys在Agent上配置Ambari Repo:利用Ambari Server上的ambari.repo文件,并且scp到Agent Host上。
- 复制Ambari Agent Setup script:利用scp命令将setupAgent.py脚本复制到Agent host上。
- 在各个Agent上执行Ambari Agent Setup script:SSH到各个Agent Host上然后执行setupAgent.py。
- 在Agent上安装epel-release:用apt-get/yum/zypper工具来安装epel-release包
- 在Agent上安装Ambari-agent:用apt-get/yum/zypper工具来安装Ambari-Agent包
- 配置Ambari-agent.ini:修改/etc/ambari-agent/conf/ambari-agent.ini,并设置agent host上的hostname
- 启动Ambari-agent:启动Ambari-agent进程
- 开始Ambari Agent注册:agent开始registration进程
2.2.3、Agent注册流程
步骤
- 连接握手端口8441:Ambari Agent连接到Ambari Server的握手端口8441。
- 下载Server Certification:Ambari Agent下载Server Certification。
- 请求签署Agent Certification:Ambari Agent请求Ambari Server来签署Agent证书。
- 签署Agent Cert:Ambari Server通过密码签署Agent证书。
- 下载Agent Cert并断掉连接:Ambari Agent下载Agent证书,然后断掉之前的连接。
- 连接注册端口8440:Ambari Agent连接到Ambari Server的注册端口8441
- 用Agent Cert执行2WAY auth:在Agent和Server之间完成2WAY权限认证。
- 获取FQDN:Ambari Agent host获取Fully Qualified Domain Name(FQDN)
- 注册Host:利用FQDN,host向Ambari Server提出注册。
- 完成Host注册:Ambari Server完成host的注册过程,把host加入到Ambari数据库
- Agent心跳程序启动:Ambari Agent向Ambari Server开启心跳程序,确认各种命令的执行
2.3、Ambari-Web
2.3.1、技术栈
Ambari-web使用了一个流行的前端Embar.js MVC框架实现,Embar.js是一个TodoMVC框架,它涵盖了现今典型的单页面应用(single page application)几乎所有的行为。
使用了nodejs
使用brunch 作为项目的构建管理工具
Brunch ,是一个超快的HTML5构建工具。它有如下功能:
(1)、编译你的脚本、模板、样式、链接它们。
(2)、将脚本和模板封装进common.js/AMD模块里,链接脚本和样式。
(3)、为链接文件生成源地图,复制资源和静态文件。
(4)、通过缩减代码和优化图片来收缩输出,看管你的文件更改。
(5)、并通过控制台和系统提示通知你错误。
Nodejs 是一个基于Chrome JavaScript运行时建立的一个平台,用来方便的搭建快速的易于扩展的网络应用,NodeJS借助事件驱动,非阻塞I/O模型变得轻量和高效,非常适合运行在分布式设备的数据密集型的实时应用。
2.3.2、Ambari-web 目录结构
目录或文件 | 描述 |
---|---|
app/ | 主要应用程序代码。包括Ember中的view、templates、controllers、models、routes |
config.coffee | Brunch应用程序生成器的配置文件 |
package.json | Npm包管理配置文件 |
test/ | 测试文件 |
vendor/ | Javascript库和样式表适用第三方库。 |
Ambari-web/app/
目录或文件 | 描述 |
---|---|
assets/ | 静态文件 |
controllers/ | 控制器 |
data/ | 数据 |
mappers/ | JSON数据到Client的Ember实体的映射 |
models | MVC中的Model |
routes/ | 路由器 |
styles | 样式文件 |
views | 试图文件 |
templates/ | 页面模板 |
app.js | Ember主程序文件 |
config.js | 配置文件 |
2.4、Ambari-Common等其他
最后
以上就是细心流沙为你收集整理的Ambari源码架构及原理分析1、Ambari project2、Ambari Modules的全部内容,希望文章能够帮你解决Ambari源码架构及原理分析1、Ambari project2、Ambari Modules所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复