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 | 配置文件 |