ambari 集成自定义组件——官方翻译-Overview

原文地址:概览

背景介绍

堆栈定义可在源树中的处找到/ambari-server/src/main/resources/stacks。安装Ambari-server后,可以在以下位置找到stack的定义结构/var/lib/ambari-server/resources/stacks

结构

Stack definition的目录一般在/var/lib/ambari-server/resources/stacks,定义结构如下

|_ stacks
   |_ <stack_name>
      |_ <stack_version>
         metainfo.xml
         |_ hooks
         |_ repos
            repoinfo.xml
         |_ services
            |_ <service_name>
               metainfo.xml
               metrics.json
               |_ configuration
                  {configuration files}
               |_ package
                  {files, scripts, templates}

定义服务和组件

服务的metainfo.xml文件描述了服务、服务的组件以及执行命令的管理脚本的使用。服务的组件可以是MASTER,SLAVE或CLIENT类别。的值告诉Ambari应该使用哪些默认命令来管理和监控组件。

对于每个组件,您指定执行命令时要使用的< commandScript >。组件必须支持一组定义好的默认命令。

component CategoryDefalut lifecycle commands
MASTERinstall, start, stop, configure, status
SLAVEinstall, start, stop, configure, status
CLIENTinstall, configure, status

Ambari支持使用PYTHON编写的不同的命令脚本,该类型用于了解如何执行命令脚本。如果组件需要支持默认生命周期命令以外的其他命令,还可以创建自定义命令。

例如,在YARN服务中,对ResourceManager组件的描述如下metainfo.xml

<component>
  <name>RESOURCEMANAGER</name>
  <category>MASTER</category>
  <commandScript>
    <script>scripts/resourcemanager.py</script>
    <scriptType>PYTHON</scriptType>
    <timeout>600</timeout>
  </commandScript>
  <customCommands>
    <customCommand>
      <name>DECOMMISSION</name>
      <commandScript>
        <script>scripts/resourcemanager.py</script>
        <scriptType>PYTHON</scriptType>
        <timeout>600</timeout>
      </commandScript>
    </customCommand>
  </customCommands>
</component>

ResourceManager是MASTER组件,命令脚本是resourcemanager.py,可以在services/YARN/package目录中找到。该命令脚本为PYTHON,该脚本将默认生命周期命令实现为python方法。这是默认INSTALL命令的安装方法:

class Resourcemanager(Script):
  def install(self, env):
    self.install_packages(env)
    self.configure(env)

您还可以看到定义了DECOMMISSION的自定义命令,这意味着该python命令脚本中还有一个下线方法:

def decommission(self, env):
  import params
  ...
  Execute(yarn_refresh_cmd,
          user=yarn_user
  )
  pass

使用堆栈继承

stacks可以继承(extend)其他stacks,以共享命令脚本和配置。这样可以减少stacks之间的代码重复,具体如下:

  • 为子堆栈定义存储库
  • 在子堆栈(而不是父堆栈)中添加新服务
  • 覆盖父服务的命令脚本
  • 覆盖父服务的配置

例如,HDP 2.6 stack 扩展了HDP 2.5堆栈,因此该stack定义中仅存在适用于HDP 2.6 stack的更改。此扩展在HDP 2.6堆栈的metainfo.xml中定义:

<metainfo>
  <versions>
    <active>true</active>
  </versions>
  <extends>2.5</extends>
</metainfo>

示例:实现自定义服务

在此示例中,我们将创建一个名为“ SAMPLESRV”的自定义服务,并将其添加到现有的Stack定义中。该服务包括MASTER,SLAVE和CLIENT组件。

创建和添加服务
  1. 在Ambari服务器上,浏览到/var/lib/ambari-server/resources/stacks/HDP/2.0.6/services目录。在这种情况下,我们将浏览至HDP 2.0堆栈定义。
  2. 创建一个名为SAMPLESRV的目录,此目录将包含这个服务的定义。/var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/SAMPLESRV
mkdir /var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/SAMPLESRV
cd /var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/SAMPLESRV
  1. 在这个服务目录创建一个metainfo.xml描述新服务的文件。例如:
<?xml version="1.0"?>
<metainfo>
    <schemaVersion>2.0</schemaVersion>
    <services>
        <service>
            <name>SAMPLESRV</name>
            <displayName>New Sample Service</displayName>
            <comment>A New Sample Service</comment>
            <version>1.0.0</version>
            <components>
                <component>
                    <name>SAMPLESRV_MASTER</name>
                    <displayName>Sample Srv Master</displayName>
                    <category>MASTER</category>
                    <cardinality>1</cardinality>
                    <commandScript>
                        <script>scripts/master.py</script>
                        <scriptType>PYTHON</scriptType>
                        <timeout>600</timeout>
                    </commandScript>
                </component>
                <component>
                    <name>SAMPLESRV_SLAVE</name>
                    <displayName>Sample Srv Slave</displayName>
                    <category>SLAVE</category>
                    <cardinality>1+</cardinality>
                    <commandScript>
                        <script>scripts/slave.py</script>
                        <scriptType>PYTHON</scriptType>
                        <timeout>600</timeout>
                    </commandScript>
                </component>
                <component>
                    <name>SAMPLESRV_CLIENT</name>
                    <displayName>Sample Srv Client</displayName>
                    <category>CLIENT</category>
                    <cardinality>1+</cardinality>
                    <commandScript>
                        <script>scripts/sample_client.py</script>
                        <scriptType>PYTHON</scriptType>
                        <timeout>600</timeout>
                    </commandScript>
                </component>
            </components>
            <osSpecifics>
                <osSpecific>
                    <osFamily>any</osFamily>  <!-- note: use osType rather than osFamily for Ambari 1.5.0 and 1.5.1 -->
                </osSpecific>
            </osSpecifics>
        </service>
    </services>
</metainfo>
  1. 在上面,我的服务名称是“ SAMPLESRV ”,它包含:
  • 一个MASTER组件“ SAMPLESRV_MASTER ”
  • 一个SLAVE组件“ SAMPLESRV_SLAVE ”
  • 一个CLIENT组件“ SAMPLESRV_CLIENT ”
  1. 接下来,让我们创建该命令脚本。为/var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/SAMPLESRV/package/scripts我们在服务metainfo中指定的命令脚本创建目录。
mkdir -p /var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/SAMPLESRV/package/scripts
cd /var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/SAMPLESRV/package/scripts
  1. 浏览到脚本目录并创建.py命令脚本文件。
    例如master.py文件:
import sys
from resource_management import *
class Master(Script):
  def install(self, env):
    print 'Install the Sample Srv Master';
  def stop(self, env):
    print 'Stop the Sample Srv Master';
  def start(self, env):
    print 'Start the Sample Srv Master';
     
  def status(self, env):
    print 'Status of the Sample Srv Master';
  def configure(self, env):
    print 'Configure the Sample Srv Master';
if __name__ == "__main__":
  Master().execute()

例如slave.py文件:

import sys
from resource_management import *
class Slave(Script):
  def install(self, env):
    print 'Install the Sample Srv Slave';
  def stop(self, env):
    print 'Stop the Sample Srv Slave';
  def start(self, env):
    print 'Start the Sample Srv Slave';
  def status(self, env):
    print 'Status of the Sample Srv Slave';
  def configure(self, env):
    print 'Configure the Sample Srv Slave';
if __name__ == "__main__":
  Slave().execute()

例如sample_client.py文件:

import sys
from resource_management import *
class SampleClient(Script):
  def install(self, env):
    print 'Install the Sample Srv Client';
  def configure(self, env):
    print 'Configure the Sample Srv Client';
if __name__ == "__main__":
  SampleClient().execute()
  1. 现在,重新启动Ambari Server,以将此新服务定义分发给群集中的所有代理。
ambari-server restart
安装服务(通过Ambari Web“添加服务”)

通过Ambari Web添加自定义服务的功能是Ambari 1.7.0的新增功能。

  1. 在Ambari Web中,浏览到“服务”,然后单击左侧“服务”导航区域中的“操作”按钮。
  2. 启动“添加服务”向导。您将看到一个包括“我的示例服务”(这是服务metainfo.xml文件中定义的服务的选项)的选项。
  3. 选择“我的样本服务”,然后单击“下一步”。
  4. 分配“ Srvle Srv Master”,然后单击“下一步”。
  5. 选择要安装“ Sample Srv Client”的主机,然后单击“下一步”。
  6. 完成后,“我的样本服务”将出现在“服务”导航区域中。
  7. 如果要将“ Sample Srv Client”添加到任何主机,则可以浏览到“主机”并导航到特定主机,然后单击“ +添加”。

示例:实现仅客户端的自定义服务

在此示例中,我们将创建一个名为“ TESTSRV”的自定义服务,将其添加到现有的Stack定义中,并使用Ambari API来安装/配置该服务。该服务是一个CLIENT,因此有两个命令:install和configure。

创建和添加服务
  1. 在Ambari服务器上,浏览到/var/lib/ambari-server/resources/stacks/HDP/2.0.6/services目录。在这种情况下,我们将浏览至HDP 2.0堆栈定义。
cd /var/lib/ambari-server/resources/stacks/HDP/2.0.6/services
  1. 创建一个名为的目录,其中将包含TESTSRV的服务定义。/var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/TESTSRV
mkdir /var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/TESTSRV
cd /var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/TESTSRV
  1. 浏览到新创建的TESTSRV目录,创建一个metainfo.xml描述新服务的文件。例如:
<?xml version="1.0"?>
<metainfo>
    <schemaVersion>2.0</schemaVersion>
    <services>
        <service>
            <name>TESTSRV</name>
            <displayName>New Test Service</displayName>
            <comment>A New Test Service</comment>
            <version>0.1.0</version>
            <components>
                <component>
                    <name>TEST_CLIENT</name>
                    <displayName>New Test Client</displayName>
                    <category>CLIENT</category>
                    <cardinality>1+</cardinality>
                    <commandScript>
                        <script>scripts/test_client.py</script>
                        <scriptType>PYTHON</scriptType>
                        <timeout>600</timeout>
                    </commandScript>
                    <customCommands>
                      <customCommand>
                        <name>SOMETHINGCUSTOM</name>
                        <commandScript>
                          <script>scripts/test_client.py</script>
                          <scriptType>PYTHON</scriptType>
                          <timeout>600</timeout>
                        </commandScript>
                      </customCommand>
                    </customCommands>
                </component>
            </components>
            <osSpecifics>
                <osSpecific>
                    <osFamily>any</osFamily>  <!-- note: use osType rather than osFamily for Ambari 1.5.0 and 1.5.1 -->
                </osSpecific>
            </osSpecifics>
        </service>
    </services>
</metainfo>
  1. 在上面,我的服务名称是“ TESTSRV ”,它包含一个组件“ TEST_CLIENT ”,它属于组件类别“ CLIENT ”。该客户端通过命令脚本进行管理scripts/test_client.py。接下来,让我们创建该命令脚本。
  2. 为/var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/TESTSRV/package/scripts我们在服务metainfo中指定的命令脚本创建目录。
mkdir -p /var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/TESTSRV/package/scripts
cd /var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/TESTSRV/package/scripts
  1. 浏览到脚本目录并创建test_client.py文件。例如:
import sys
from resource_management import *
 
class TestClient(Script):
  def install(self, env):
    print 'Install the client';
  def configure(self, env):
    print 'Configure the client';
  def somethingcustom(self, env):
    print 'Something custom';
 
if __name__ == "__main__":
  TestClient().execute()
  1. 现在,重新启动Ambari Server,以将此新服务定义分发给群集中的所有代理。
ambari-server restart
安装服务(通过Ambari REST API)
  1. 将服务添加到群集。
POST
/api/v1/clusters/MyCluster/services
 
{
"ServiceInfo": {
  "service_name":"TESTSRV"
  }
}
  1. 将组件添加到服务。在这种情况下,请将TEST_CLIENT添加到TESTSRV。
POST
/api/v1/clusters/MyCluster/services/TESTSRV/components/TEST_CLIENT
  1. 在所有目标主机上安装组件。例如,要安装在c6402.ambari.apache.org和c6403.ambari.apache.org,请首先使用POST在主机上创建host_component资源。
POST
/api/v1/clusters/MyCluster/hosts/c6402.ambari.apache.org/host_components/TEST_CLIENT
 
POST
/api/v1/clusters/MyCluster/hosts/c6403.ambari.apache.org/host_components/TEST_CLIENT
  1. 现在,让Ambari在所有主机上安装组件。在此单个命令中,您将指示Ambari安装与该服务相关的所有组件。这将install()在每个主机上的命令脚本中调用该方法。
PUT
/api/v1/clusters/MyCluster/services/TESTSRV
 
{
  "RequestInfo": {
    "context": "Install Test Srv Client"
  },
  "Body": {
    "ServiceInfo": {
      "state": "INSTALLED"
    }   
  }
}   
  1. 另外,您可以显式安装每个主机组件,而不是同时安装所有组件。在此示例中,我们将在以下位置显式安装TEST_CLIENT c6402.ambari.apache.org:
PUT
/api/v1/clusters/MyCluster/hosts/c6402.ambari.apache.org/host_components/TEST_CLIENT
 
{
  "RequestInfo": {
    "context":"Install Test Srv Client"
  },
  "Body": {
    "HostRoles": {
      "state":"INSTALLED"
    }
  }
}
  1. 使用以下命令在主机上配置客户端。最终将configure()在命令脚本中调用该方法。
POST
/api/v1/clusters/MyCluster/requests
  
{
  "RequestInfo" : {
    "command" : "CONFIGURE",
    "context" : "Config Test Srv Client"
  },
  "Requests/resource_filters": [{
    "service_name" : "TESTSRV",
    "component_name" : "TEST_CLIENT",
    "hosts" : "c6403.ambari.apache.org"
  }]
}
  1. 如果要查看该组件安装在哪些主机上。
GET
/api/v1/clusters/MyCluster/components/TEST_CLIENT
安装服务(通过Ambari Web“添加服务”)
  1. 在Ambari Web中,浏览到“服务”,然后单击左侧“服务”导航区域中的“操作”按钮。
  2. 启动“添加服务”向导。您将看到一个包括“My Test Service”(这是服务metainfo.xml文件中定义的服务的选项)的选项。
  3. 选择“My Test Service”,然后单击“下一步”。
  4. 选择主机以安装“ New Test Client”,然后单击“下一步”。
  5. 完成后,“My Test Service”将在“服务”导航区域中可用。
  6. 如果要将“My Test Service”添加到任何主机,则可以浏览到主机并导航到特定主机,然后单击“ +添加”。

示例:实现仅客户端的自定义服务(带有配置)

在此示例中,我们将创建一个名为“ TESTCONFIGSRV”的自定义服务,并将其添加到现有的堆栈定义中。该服务是一个CLIENT,因此有两个命令:install和configure。并且该服务还包括配置类型“ test-config”。

创建服务并将其添加到堆栈
  1. 在Ambari服务器上,浏览到/var/lib/ambari-server/resources/stacks/HDP/2.0.6/services目录。在这个示例下,我们将浏览至HDP 2.0.6的堆栈定义。
cd /var/lib/ambari-server/resources/stacks/HDP/2.0.6/services
  1. 创建一个将包含名为TESTCONFIGSRV的服务定义的目录。/var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/TESTCONFIGSRV
mkdir /var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/TESTCONFIGSRV
cd /var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/TESTCONFIGSRV
  1. 浏览到新创建的TESTCONFIGSRV目录,创建一个metainfo.xml描述新服务的文件。例如:
<?xml version="1.0"?>
<metainfo>
    <schemaVersion>2.0</schemaVersion>
    <services>
        <service>
            <name>TESTCONFIGSRV</name>
            <displayName>New Test Config Service</displayName>
            <comment>A New Test Config Service</comment>
            <version>0.1.0</version>
            <components>
                <component>
                    <name>TESTCONFIG_CLIENT</name>
                    <displayName>New Test Config Client</displayName>
                    <category>CLIENT</category>
                    <cardinality>1+</cardinality>
                    <commandScript>
                        <script>scripts/test_client.py</script>
                        <scriptType>PYTHON</scriptType>
                        <timeout>600</timeout>
                    </commandScript>
                </component>
            </components>
            <osSpecifics>
                <osSpecific>
                    <osFamily>any</osFamily>  <!-- note: use osType rather than osFamily for Ambari 1.5.0 and 1.5.1 -->
                </osSpecific>
            </osSpecifics>
        </service>
    </services>
</metainfo>
  1. 在上面,我的服务名称是“ TESTCONFIGSRV ”,它包含一个组件“ TESTCONFIG_CLIENT ”,它属于组件类别“ CLIENT ”。该客户端通过命令脚本进行管理scripts/test_client.py。接下来,让我们创建该命令脚本。
  2. 为我们在服务的metainfo中指定的命令脚本/var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/TESTCONFIGSRV/package/scripts创建目录。
mkdir -p /var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/TESTCONFIGSRV/package/scripts
cd /var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/TESTCONFIGSRV/package/scripts
  1. 浏览到脚本目录并创建test_client.py文件。例如:
import sys
from resource_management import *
 
class TestClient(Script):
  def install(self, env):
    print 'Install the config client';
  def configure(self, env):
    print 'Configure the config client';
 
if __name__ == "__main__":
  TestClient().execute()
  1. 现在让我们为此服务定义一个配置类型。为配置字典文件创建目录/var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/TESTCONFIGSRV/configuration。
mkdir -p /var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/TESTCONFIGSRV/configuration
cd /var/lib/ambari-server/resources/stacks/HDP/2.0.6/services/TESTCONFIGSRV/configuration
  1. 浏览到配置目录并创建test-config.xml文件。例如:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 
<configuration>
  <property>
    <name>some.test.property</name>
    <value>this.is.the.default.value</value>
    <description>This is a kool description.</description>
 </property>
</configuration>
  1. 现在,重新启动Ambari Server,以将此新服务定义分发给群集中的所有代理。
ambari-server restart
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值