Ambari 增加新的stack示例

    Ambari是什么?简单介绍一下,Ambari是hadoop的管理平台,提供hadoop集群部署、管理和监控的服务。

    HDP已经提供当下一些流行的大数据处理框架,hdfs、hbase、spark、flume等等,当我们想通过Ambari增加对于其他框架的支持时,我们应该怎么做?    Ambari也提供了方便的扩展,步骤如下:

    先定义一个概念 Stack ,Service,Component

项目描述
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 定义的文件和结构

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,怎么安装,执行什么脚本

<?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 结构

Service

Service是你安装的服务,包含components, osSpecifics, commandScript, requiredServices 和configuration-dependencies

<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 期望知道如何管理分布应用的拓扑结构

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

 

安装成功

 

 

 

 

转载于:https://my.oschina.net/u/2277929/blog/666180

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值