Ambari是什麼?簡單介紹一下,Ambari是hadoop的管理平臺,提供hadoop集羣部署、管理和監控的服務。node
HDP已經提供當下一些流行的大數據處理框架,hdfs、hbase、spark、flume等等,當咱們想經過Ambari增長對於其餘框架的支持時,咱們應該怎麼作? Ambari也提供了方便的擴展,步驟以下:python
先定義一個概念 Stack ,Service,Componentjson
項目 | 描述 |
Stack | 一系列Service組成的軟件包,一個Stack能夠包含多個版本,例如Stack=HDP-1.3.3 |
Service | 多個Component(master,slave,client)組成,例如Service=HDFS |
Component | 獨立的Component有制定的生命週期:start,stop,instal,etc.例如:Service = HDFS,擁有組件NameNode(master),Secondary NameNode(master),DataNode(Slave) ,HDFS Client(client) |
1. ambari stack 定義的文件和結構ubuntu
metainfo.xml metrics.json |_configuration my-config-env.xml |_package |_scripts master.py slave.py client.py service_check.py params.py
metainfo.xml 定義什麼stack,怎麼安裝,執行什麼腳本bash
<?xml version="1.0"?> <metainfo> <schemaVersion>2.0</schemaVersion> <services> <service> <name>DUMMY_APP</name> <displayName>My Dummy APP</displayName> <comment>This is a distributed app.</comment> <version>0.1</version> <components> <component> <name>DUMMY_MASTER</name> <displayName>Dummy Master Component</displayName> <category>MASTER</category> <cardinality>1</cardinality> <commandScript> <script>scripts/master.py</script> <scriptType>PYTHON</scriptType> <timeout>600</timeout> </commandScript> <customCommands> <customCommand> <name>MYCOMMAND</name> <commandScript> <script>scripts/mycustomcommand.py</script> <scriptType>PYTHON</scriptType> <timeout>600</timeout> </commandScript> </customCommand> </customCommands> </component> <component> <name>DUMMY_SLAVE</name> <displayName>Dummy Slave Component</displayName> <category>SLAVE</category> <cardinality>1+</cardinality> <commandScript> <script>scripts/slave.py</script> <scriptType>PYTHON</scriptType> <timeout>600</timeout> </commandScript> </component> <component> <name>DUMMY_CLIENT</name> <displayName>Dummy Client Component</displayName> <category>CLIENT</category> <cardinality>0+</cardinality> <commandScript> <script>scripts/client.py</script> <scriptType>PYTHON</scriptType> <timeout>600</timeout> </commandScript> </component> </components> <osSpecifics> <osSpecific> <osFamily>any</osFamily> <packages> <package> <name>imagemagick</name> </package> <package> <name>dummy-app</name> </package> </packages> </osSpecific> </osSpecifics> <commandScript> <script>scripts/service_check.py</script> <scriptType>PYTHON</scriptType> <timeout>300</timeout> </commandScript> <requiredServices> <service>HDFS</service> <service>YARN</service> </requiredServices> <configuration-dependencies> <config-type>my-config-env</config-type> </configuration-dependencies> </service> </services> </metainfo>
metainfo.xml 結構app
Service框架
Service是你安裝的服務,包含components, osSpecifics, commandScript, requiredServices 和configuration-dependenciesoop
<service> <name>DUMMY_APP</name> <displayName>My Dummy APP</displayName> <comment>This is a distributed app.</comment> <version>0.1</version> <components> ... </components> <osSpecifics> ... </osSpecifics> <commandScript> ... </commandScript> <requiredServices> ... </requiredServices> <configuration-dependencies> ... </configuration-dependencies> </service>
components大數據
components 定義你要分發應用的拓撲結構。當前示例咱們有MASTERnode,SALVE nodes 和 CLIENT。Ambari 指望知道如何管理分佈應用的拓撲結構。ui
<component> <name>DUMMY_MASTER</name> <displayName>Dummy Master Component</displayName> <category>MASTER</category> <cardinality>1</cardinality> <commandScript> <script>scripts/master.py</script> <scriptType>PYTHON</scriptType> <timeout>600</timeout> </commandScript> <customCommands> <customCommand> <name>MYCOMMAND</name> <commandScript> <script>scripts/mycustomcommand.py</script> <scriptType>PYTHON</scriptType> <timeout>600</timeout> </commandScript> </customCommand> </customCommands> </component>
比較重要的標籤是category,cardinality和commandScript。
category:包含三種 MASTER, SLAVE 和 CLIENT 。每一個節點能夠安裝任意的組合
Cardinality:每一個組件能夠有多少個節點安裝。在這個例子中,1個master,1+ slaves 和 0+ clients
command script :執行的腳本
OS Specifics
該標籤描述這個組件須要的依賴。Ambari 會使用yum或者apt-get去安裝這些依賴。
<osSpecific> <osFamily>any</osFamily> <packages> <package> <name>imagemagick</name> </package> <package> <name>dummy-app</name> </package> </packages> </osSpecific>
osFamily : 支持 Linux 的發行版本,如 redhat6, suse11, ubuntu12
package :依賴的包,Ambari 會使用yum或者apt-get去安裝這些依賴。
Command Script
commandScript: 管理服務的腳本位置,如今腳本只支持python腳本,下面是腳本的示例
import sys from resource_management import * class DummyMaster(Script): def install(self, env): import params env.set_params(params) print 'Install the Master' self.install_packages(env) def stop(self, env): print 'Stop the Master' def start(self, env): import params env.set_params(params) print 'Start the Master' def status(self, env): print 'Status of the Master' if __name__ == "__main__": DummyMaster().execute()
install
只在service 安裝時執行。調用Ambari安裝經過self.install_packages(env)。查找安裝依賴列表。params 是 參數模塊,下面會介紹。
start
在WebUI中執行start service時調用,相似於service myservice start 之類
stop
stop service
status
Ambari 自動執行,用來查找當前服務的狀態
resource_management
Ambari 提供python方法執行系統級別的命令。腳本目錄在../resource_management/core內,能夠都查看一下,比較有用。寫執行腳本時,都須要引用一下
from resource_management import *
Execute()
python執行系統命令,能夠提供超時、嘗試、不一樣用戶執行、條件檢查
示例以下:
Execute( 'mkdir -P /tmp/myservice', logoutput = True )
上面示例 建立/tmp/myservice 文件夾,記錄log輸出,而且在Ambari UI中顯示
ExecuteHadoop()
執行hadoop --config命令
import params ExecuteHadoop('fs -mkdir -p /tmp/myservice', user=params.hdfs_user, logoutput=True, conf_dir=params.hadoop_conf_dir, try_sleep=3, tries=5, bin_dir=params.hadoop_bin_dir )
建立HDFS://tmp/myservice目錄,指定使用的 hdfs的用戶
format()
格式化字符串,下例會輸出 foo bar baz
localVar = "bar" print format("foo {localVar} baz")
Component Status
這個status比較重要,ambari會定時使用這個方法去顯示組件的狀態和執行各類操做前的驗證。舉個例子,若是你想刪除這個組件,Ambari必須等待直到這個組件中止。這塊若是沒有配置好,這個組件將永遠不能刪除。
Ambari提供了比較便利獲取pid的方法,這樣很容易判斷進程是否存活。獲取以下:
def status(self, env): print 'Status of the Dummy Master' dummy_master_pid_file = "/tmp/dummy_master.pid" check_process_status(dummy_master_pid_file)
check_process_status() 檢查進程狀態,若是該進程以dump.pid中PID運行,將正常退出
Ambari 將得到返回的狀態,顯示在界面上,若是有錯誤,將標記成stopped
Service Status
服務狀態不一樣於組件狀態,是整個組件的狀態。這個方法只在Master中運行,只能由Ambari WebUI的用戶調用。check腳本以下:
<commandScript> <script>scripts/service_check.py</script> <scriptType>PYTHON</scriptType> <timeout>300</timeout> </commandScript>
Custom Commands
customCommand 跟commandScript相似。可是必須包含與name標籤同樣名字的方法。
Required Services
須要安裝service 前必須安裝的依賴。
<requiredServices> <service>HDFS</service> <service>YARN</service> </requiredServices>
Configuration Dependencies
配置文件依賴。用戶能夠經過Ambari Web UI 進行服務配置的修改。全部的屬性都定義在xml中。 上面示例中有個配置文件叫作my-config-env,下面介紹一下結構
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>dummy_user</name> <value>dummy</value> <description>Dummy App User Name.</description> </property> <property> <name>dummy_var</name> <value>123</value> <description>Dummy Variable.</description> </property> </configuration>
... def install(self, env): # Import the Resource Management package from resource_management import * # Load the all configuration files config = Script.get_config() # Bind to a local variable dummy_user = config['configurations']['my-config-env']['dummy_user'] print 'Install the Master.' # Install packages self.install_packages(env) # Create a new user and group Execute( format("groupadd -f {dummy_user}")) Execute( format("useradd -s /bin/bash {dummy_user} -g {dummy_user}")) print 'Installation complete.' ...
在執行install中,咱們使用Scirpt.get_config()得到全部配置文件中的變量
全局變量
在安裝過程當中,咱們須要知道哪些是master,哪些是slaves
# Import the Resource Management package from resource_management import * config = Script.get_config() # Find the master node and the slaves list for our DUMMY_APP service masterNode = config['clusterHostInfo']['dummy_app_master_hosts'][0] slaveList = config['clusterHostInfo']['dummy_app_slave_hosts']
安裝新的Stack
將DUMMY_SERVICE拷貝到/var/lib/ambari-server/resources/stacks/HDP/2.4/services/DUMMY_SERVICE
重啓Ambari-Service restart
安裝界面
1.Ambari Dashboard
2.選擇Actions>Add Service
3.安裝服務界面
4.選擇master節點
5。選擇salves 節點
6. 配置服務
安裝成功