一、Ambari基本架構(gòu)

Ambari Server 會(huì)讀取 Stack 和 Service 的配置文件。當(dāng)用 Ambari 創(chuàng)建服務(wù)的時(shí)候,Ambari Server 傳送 Stack 和 Service 的配置文件以及 Service 生命周期的控制腳本到 Ambari Agent。Agent 拿到配置文件后,會(huì)下載安裝公共源里軟件包(Redhat,就是使用 yum 服務(wù))。安裝完成后,Ambari Server 會(huì)通知 Agent 去啟動(dòng) Service。之后 Ambari Server 會(huì)定期發(fā)送命令到 Agent 檢查 Service 的狀態(tài),Agent 上報(bào)給 Server,并呈現(xiàn)在 Ambari 的 GUI 上。
二、創(chuàng)建Ambari自定義Service
#AmbariServer資源文件在/var/lib/ambari-server/resources目錄
#cd到Ambari Stack目錄下 (目前最新版為2.6)
cd /var/lib/ambari-server/resources/stacks/HDP/2.6/services
#創(chuàng)建自定義Service目錄 (以大寫ServiceName命令,這里以My Service為例)
mkdir MYSERVICE
cd MYSERVICE
1.編輯metainfo.xml
<?xml version="1.0"?>
<metainfo>
<schemaVersion>2.0</schemaVersion>
<services>
<service>
<!-- -->
<!-- 編寫Service名稱和Service信息 -->
<name>MYSERVICE</name>
<displayName>My Service</displayName>
<comment>this is comment</comment>
<version>1.0</version>
<components>
<component>
<!-- 編寫Master組件 -->
<name>MYMASTER</name>
<displayName>My Master</displayName>
<category>MASTER</category>
<cardinality>1</cardinality>
<commandScript>
<script>scripts/master.py</script>
<scriptType>PYTHON</scriptType>
<timeout>5000</timeout>
</commandScript>
</component>
<component>
<!-- 編寫Slave組件 -->
<name>MYSALVE</name>
<displayName>My Slave</displayName>
<category>SLAVE</category>
<cardinality>1+</cardinality>
<commandScript>
<script>scripts/slave.py</script>
<scriptType>PYTHON</scriptType>
<timeout>5000</timeout>
</commandScript>
</component>
</components>
<osSpecifics>
<osSpecific>
<osFamily>any</osFamily>
</osSpecific>
</osSpecifics>
</service>
</services>
</metainfo>
- components 下編寫多個(gè)組件。
- category 為組件的角色,支持Master、Slave、和Client
- cardinality 為節(jié)點(diǎn)數(shù)量,可以為1、1+、或數(shù)值范圍1-2
- commandScript 為組件生命周期回調(diào)的腳本
2.編寫Master組件生命周期回調(diào)腳本
mkdir -p package/scripts
vim package/scripts/master.py
import sys, os
from resource_management import *
from resource_management.core.exceptions import ComponentIsNotRunning
from resource_management.core.environment import Environment
from resource_management.core.logger import Logger
class Master(Script):
def install(self, env):
print "Install My Master"
def configure(self, env):
print "Configure My Master"
def start(self, env):
print "Start My Master"
def stop(self, env):
print "Stop My Master"
def status(self, env):
print "Status..."
if __name__ == "__main__":
Master().execute()
3.編寫Slave組件生命周期回調(diào)腳本
package/scripts/slave.py
import sys, os
from resource_management import *
from resource_management.core.exceptions import ComponentIsNotRunning
from resource_management.core.environment import Environment
from resource_management.core.logger import Logger
class Slave(Script):
def install(self, env):
print "Install My Slave"
def configure(self, env):
print "Configure My Slave"
def start(self, env):
print "Start My Slave"
def stop(self, env):
print "Stop My Slave"
def status(self, env):
print "Status..."
if __name__ == "__main__":
Slave().execute()
4.重啟AmbariServer
ambari-server restart
5.加入剛才添加的My Service服務(wù)
-
在Ambari Web上。點(diǎn)擊Actions-> Add Service 添加My Service服務(wù)
WX20170728-150942@2x.png
三、豐富自定義Service功能
1.增加Service Check邏輯
在 Service 的 metainfo.xml 中,commandScript 字段就是用來配置 service check 腳本入口。如果一個(gè) Service 的 metainfo.xml 有該字段,那么在 Service 的 Action 列表中就會(huì)出現(xiàn)“Run Service Check”這個(gè)命令。
當(dāng)用戶在 WEB 中點(diǎn)擊“Run Service Check”時(shí),Ambari Server 會(huì)隨機(jī)通知一個(gè)該 Service 所在機(jī)器上的 Agent 進(jìn)程,然后由 Agent 執(zhí)行該 Service check 腳本。
<commandScript>
<script>scripts/master/my_check.py</script>
<scriptType>PYTHON</scriptType> <timeout>300</timeout>
</commandScript>

2.增加Service 的配置項(xiàng)
這里需要在Service的metainfo.xml 中增加<configuration-dependencies>字段。該字段就是用來關(guān)聯(lián)一個(gè) Service 與配置項(xiàng)文件入口
每一行<config-type>字段,用來指定一個(gè)配置文件。一個(gè) Service 可以同時(shí)指定多個(gè)配置文件。不過所有的配置文件必須放在 Service 的 configuration 目錄中。
<!-- 以HDFS為例 -->
<metainfo>
<services>
<service>
<!-- 省略... -->
<configuration-dependencies>
<!-- 在下面指定配置文件 -->
<config-type>core-site</config-type>
<config-type>hdfs-site</config-type>
<config-type>hadoop-env</config-type>
<config-type>hadoop-policy</config-type>
<config-type>hdfs-log4j</config-type>
<config-type>ranger-hdfs-plugin-properties</config-type>
<config-type>ssl-client</config-type>
<config-type>ssl-server</config-type>
<config-type>ranger-hdfs-audit</config-type>
<config-type>ranger-hdfs-policymgr-ssl</config-type>
<config-type>ranger-hdfs-security</config-type>
</configuration-dependencies>
<restartRequiredAfterRackChange>true</restartRequiredAfterRackChange>
</service>
</services>
</metainfo>
#configuration目錄下的文件:
[root@node1 2.1.0.2.0]# ll configuration/
total 84
-rwxr-xr-x 1 admin root 7948 May 27 10:11 core-site.xml
-rwxr-xr-x 1 admin root 16723 May 27 10:11 hadoop-env.xml
-rwxr-xr-x 1 admin root 6201 May 27 10:11 hadoop-policy.xml
-rwxr-xr-x 1 admin root 8879 May 27 10:11 hdfs-log4j.xml
-rwxr-xr-x 1 admin root 8192 May 27 10:11 hdfs-logsearch-conf.xml
-rwxr-xr-x 1 admin root 19139 May 27 10:11 hdfs-site.xml
-rwxr-xr-x 1 admin root 2627 May 27 10:11 ssl-client.xml
-rwxr-xr-x 1 admin root 2959 May 27 10:11 ssl-server.xml
配置文件中,其實(shí)就是指定了一些鍵值對的屬性,以及一個(gè)描述。當(dāng)在 Ambari 的 WEB 中增加這個(gè) Service 時(shí),Ambari Server 會(huì)讀取這些信息,并顯示到該 service 的配置頁面中(Customize Service 和 config 頁面)。默認(rèn)情況下,如果一個(gè)配置項(xiàng)沒有配置默認(rèn)值,用戶則必須輸入。如果一個(gè)項(xiàng)允許為空,則需要在<property>中增加 require-input="false“的屬性。
3.增加自定義Command
以RebalanceHDFS為例,在Service的metainfo.xml中增加以下內(nèi)容
當(dāng)點(diǎn)擊RebalanceHDFS后 則觸發(fā)scripts/namenode.py腳本
<customCommands>
<customCommand>
<name>REBALANCEHDFS</name>
<background>true</background>
<commandScript>
<script>scripts/namenode.py</script>
<scriptType>PYTHON</scriptType>
</commandScript>
</customCommand>
</customCommands>

