Ambari 增長新的stack示例

    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. 配置服務

 

安裝成功

相關文章
相關標籤/搜索