Ambari源码架构及原理分析

1、Ambari project

1.1、基本概念

  1. Resource:Ambari把可以被管理的资源的抽象为一个Resource实例,资源可以包括服务、组件、主机节点等,一个resource实例中包含了一系列该资源的属性;

  2. Property:服务组件的指标名称;

  3. ResourceProvider和PropertyProvider分别对应Resource和Property的提供方,获取指标需要先获取Resource,然后获取Property对应的metric;

  4. Query:Query是Resource的内部对象,代表了对该资源的操作;

  5. Request:一个Request代表了对Resource的操作请求,包含http信息及要操作的Resource的实例,Request按照http的请求方式分为四种:GET、PUT、DELETE、POST;

  6. 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、架构

Ambari源码架构及原理分析_第1张图片

  1. 对外,Ambarii-Server提供ambari web,rest api,ambari shell三大方式操作机群;

  2. ambari将集群的配置、各个服务的配置等信息存在ambari server端的DB中(比如可以是postgresql);

  3. ambari server与ambari agent的交流走RPC,即agent向server报告心跳,server将command通过respons发回给agent,agent本地执行命令,比如:agent端执行相应的python脚本;

  4. ambari有自己的一套监控、告警、镜像服务,以可插拔的形式供上层服务调用;

Ambari源码架构及原理分析_第2张图片

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端主要维护三类状态:

  1. Live Cluster State:集群现有状态,各个节点汇报上来的状态信息会更改该状态;

  2. Desired State:用户希望该节点所处状态,是用户在页面进行了一系列的操作,需要更改某些服务的状态,这些状态还没有在节点上产生作用;

  3. Action State:操作状态,是状态改变时的请求状态,也可以看作是一种中间状态,这种状态可以辅助Live Cluster State向Desired State状态转变。

Ambari源码架构及原理分析_第3张图片
Ambari-server的Heartbeat Handler模块用于接收各个agent的心跳请求(心跳请求里面主要包含两类信息:节点状态信息和返回的操作结果),把节点状态信息传递给FSM状态机去维护着该节点的状态,并且把返回的操作结果信息返回给Action Manager去做进一步的处理。

Coordinator模块又可以称为API handler,主要在接收WEB端操作请求后,会检查它是否符合要求,stage planner分解成一组操作,最后提供给Action Manager去完成执行操作

因此,从上图就可以看出,Ambari-Server的所有状态信息的维护和变更都会记录在数据库中,用户做一些更改服务的操作都会在数据库上做一些相应的记录,同时,agent通过心跳来获得数据库的变更历史。

Ambari源码架构及原理分析_第4张图片

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脚本等模块完成任务。

Ambari源码架构及原理分析_第5张图片

2.2.2、Ambari-agent引导流程

分别是用SSH和人工手动的非SSH
步骤:

  1. Ambari Server通过调用bootstrap.py来初始化整个bootstrap进程
  2. Server端通过SSH Keys在Agent上配置Ambari Repo:利用Ambari Server上的ambari.repo文件,并且scp到Agent Host上。
  3. 复制Ambari Agent Setup script:利用scp命令将setupAgent.py脚本复制到Agent host上。
  4. 在各个Agent上执行Ambari Agent Setup script:SSH到各个Agent Host上然后执行setupAgent.py。
  5. 在Agent上安装epel-release:用apt-get/yum/zypper工具来安装epel-release包
  6. 在Agent上安装Ambari-agent:用apt-get/yum/zypper工具来安装Ambari-Agent包
  7. 配置Ambari-agent.ini:修改/etc/ambari-agent/conf/ambari-agent.ini,并设置agent host上的hostname
  8. 启动Ambari-agent:启动Ambari-agent进程
  9. 开始Ambari Agent注册:agent开始registration进程
    Ambari源码架构及原理分析_第6张图片

Ambari源码架构及原理分析_第7张图片

2.2.3、Agent注册流程

步骤

  1. 连接握手端口8441:Ambari Agent连接到Ambari Server的握手端口8441。
  2. 下载Server Certification:Ambari Agent下载Server Certification。
  3. 请求签署Agent Certification:Ambari Agent请求Ambari Server来签署Agent证书。
  4. 签署Agent Cert:Ambari Server通过密码签署Agent证书。
  5. 下载Agent Cert并断掉连接:Ambari Agent下载Agent证书,然后断掉之前的连接。
  6. 连接注册端口8440:Ambari Agent连接到Ambari Server的注册端口8441
  7. 用Agent Cert执行2WAY auth:在Agent和Server之间完成2WAY权限认证。
  8. 获取FQDN:Ambari Agent host获取Fully Qualified Domain Name(FQDN)
  9. 注册Host:利用FQDN,host向Ambari Server提出注册。
  10. 完成Host注册:Ambari Server完成host的注册过程,把host加入到Ambari数据库
  11. Agent心跳程序启动:Ambari Agent向Ambari Server开启心跳程序,确认各种命令的执行
    Ambari源码架构及原理分析_第8张图片

Ambari源码架构及原理分析_第9张图片

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)