我是靠谱客的博主 细心流沙,最近开发中收集的这篇文章主要介绍Ambari源码架构及原理分析1、Ambari project2、Ambari Modules,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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、源码项目模块

moduledescription
ambari-serverAmbari的Server程序,主要管理部署在每个节点上的管理监控程序
Ambari-agent部署在监控节点上运行的管理监控程序
Contrib自定义第三方库
ambari-webAmbari页面UI的代码,作为用户与Ambari server交互的。
ambari-views用于扩展Ambari Web UI中的框架
Docs文档
ambari-commonAmbari-server 和Ambari-agent 共用的代码

2、Ambari Modules

2.1、Ambari-Server

2.1.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-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-server的Heartbeat Handler模块用于接收各个agent的心跳请求(心跳请求里面主要包含两类信息:节点状态信息和返回的操作结果),把节点状态信息传递给FSM状态机去维护着该节点的状态,并且把返回的操作结果信息返回给Action Manager去做进一步的处理。

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BfqBG1t7-1591944915685)(Ambari%E6%BA%90%E7%A0%81%E6%9E%B6%E6%9E%84%E5%88%86%E6%9E%90.assets/image-20200612143814816.png)]

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.TypeResourceProvider
WorkflowWorkflowResourceProvider
JobJobResourceProvider
TaskAttemptTaskAttemptResourceProvider
ViewViewResourceProvider
ViewInstanceViewInstanceResourceProvider
BlueprintBlueprintResourceProvider
ClusterClusterResourceProvider
ServiceServiceResourceProvider
ComponentComponentResourceProvider
HostHostResourceProvider
HostComponentHostComponentResourceProvider
ConfigurationConfigurationResourceProvider
ActionActionResourceProvider
RequestRequestResourceProvider
TaskTaskResourceProvider
UserUserResourceProvider
StackStackResourceProvider
StackVersionStackVersionResourceProvider
StackServiceStackServiceResourceProvider
StackServiceComponentStackServiceComponentResourceProvider
StackConfigurationStackConfigurationResourceProvider
OperatingSystemOperatingSystemResourceProvider
RepositoryRepositoryResourceProvider
RootServiceRootServiceResourceProvider
RootServiceComponentRootServiceComponentResourceProvider
RootServiceHostComponentRootServiceHostComponentResourceProvider
ConfigGroupConfigGroupResourceProvider
RequestScheduleRequestScheduleResourceProvider

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
步骤:

  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进程
    在这里插入图片描述

在这里插入图片描述

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开启心跳程序,确认各种命令的执行
    在这里插入图片描述

这里写图片描述

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.coffeeBrunch应用程序生成器的配置文件
package.jsonNpm包管理配置文件
test/测试文件
vendor/Javascript库和样式表适用第三方库。

Ambari-web/app/

目录或文件描述
assets/静态文件
controllers/控制器
data/数据
mappers/JSON数据到Client的Ember实体的映射
modelsMVC中的Model
routes/路由器
styles样式文件
views试图文件
templates/页面模板
app.jsEmber主程序文件
config.js配置文件

2.4、Ambari-Common等其他

最后

以上就是细心流沙为你收集整理的Ambari源码架构及原理分析1、Ambari project2、Ambari Modules的全部内容,希望文章能够帮你解决Ambari源码架构及原理分析1、Ambari project2、Ambari Modules所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部