原文地址:概览
背景介绍
堆栈定义可在源树中的处找到/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 Category | Defalut lifecycle commands |
---|---|
MASTER | install, start, stop, configure, status |
SLAVE | install, start, stop, configure, status |
CLIENT | install, 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组件。
创建和添加服务
- 在Ambari服务器上,浏览到/var/lib/ambari-server/resources/stacks/HDP/2.0.6/services目录。在这种情况下,我们将浏览至HDP 2.0堆栈定义。
- 创建一个名为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
- 在这个服务目录创建一个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>
- 在上面,我的服务名称是“ SAMPLESRV ”,它包含:
- 一个MASTER组件“ SAMPLESRV_MASTER ”
- 一个SLAVE组件“ SAMPLESRV_SLAVE ”
- 一个CLIENT组件“ SAMPLESRV_CLIENT ”
- 接下来,让我们创建该命令脚本。为/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
- 浏览到脚本目录并创建.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()
- 现在,重新启动Ambari Server,以将此新服务定义分发给群集中的所有代理。
ambari-server restart
安装服务(通过Ambari Web“添加服务”)
通过Ambari Web添加自定义服务的功能是Ambari 1.7.0的新增功能。
- 在Ambari Web中,浏览到“服务”,然后单击左侧“服务”导航区域中的“操作”按钮。
- 启动“添加服务”向导。您将看到一个包括“我的示例服务”(这是服务metainfo.xml文件中定义的服务的选项)的选项。
- 选择“我的样本服务”,然后单击“下一步”。
- 分配“ Srvle Srv Master”,然后单击“下一步”。
- 选择要安装“ Sample Srv Client”的主机,然后单击“下一步”。
- 完成后,“我的样本服务”将出现在“服务”导航区域中。
- 如果要将“ Sample Srv Client”添加到任何主机,则可以浏览到“主机”并导航到特定主机,然后单击“ +添加”。
示例:实现仅客户端的自定义服务
在此示例中,我们将创建一个名为“ TESTSRV”的自定义服务,将其添加到现有的Stack定义中,并使用Ambari API来安装/配置该服务。该服务是一个CLIENT,因此有两个命令:install和configure。
创建和添加服务
- 在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
- 创建一个名为的目录,其中将包含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
- 浏览到新创建的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>
- 在上面,我的服务名称是“ TESTSRV ”,它包含一个组件“ TEST_CLIENT ”,它属于组件类别“ CLIENT ”。该客户端通过命令脚本进行管理scripts/test_client.py。接下来,让我们创建该命令脚本。
- 为/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
- 浏览到脚本目录并创建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()
- 现在,重新启动Ambari Server,以将此新服务定义分发给群集中的所有代理。
ambari-server restart
安装服务(通过Ambari REST API)
- 将服务添加到群集。
POST
/api/v1/clusters/MyCluster/services
{
"ServiceInfo": {
"service_name":"TESTSRV"
}
}
- 将组件添加到服务。在这种情况下,请将TEST_CLIENT添加到TESTSRV。
POST
/api/v1/clusters/MyCluster/services/TESTSRV/components/TEST_CLIENT
- 在所有目标主机上安装组件。例如,要安装在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
- 现在,让Ambari在所有主机上安装组件。在此单个命令中,您将指示Ambari安装与该服务相关的所有组件。这将install()在每个主机上的命令脚本中调用该方法。
PUT
/api/v1/clusters/MyCluster/services/TESTSRV
{
"RequestInfo": {
"context": "Install Test Srv Client"
},
"Body": {
"ServiceInfo": {
"state": "INSTALLED"
}
}
}
- 另外,您可以显式安装每个主机组件,而不是同时安装所有组件。在此示例中,我们将在以下位置显式安装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"
}
}
}
- 使用以下命令在主机上配置客户端。最终将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"
}]
}
- 如果要查看该组件安装在哪些主机上。
GET
/api/v1/clusters/MyCluster/components/TEST_CLIENT
安装服务(通过Ambari Web“添加服务”)
- 在Ambari Web中,浏览到“服务”,然后单击左侧“服务”导航区域中的“操作”按钮。
- 启动“添加服务”向导。您将看到一个包括“My Test Service”(这是服务metainfo.xml文件中定义的服务的选项)的选项。
- 选择“My Test Service”,然后单击“下一步”。
- 选择主机以安装“ New Test Client”,然后单击“下一步”。
- 完成后,“My Test Service”将在“服务”导航区域中可用。
- 如果要将“My Test Service”添加到任何主机,则可以浏览到主机并导航到特定主机,然后单击“ +添加”。
示例:实现仅客户端的自定义服务(带有配置)
在此示例中,我们将创建一个名为“ TESTCONFIGSRV”的自定义服务,并将其添加到现有的堆栈定义中。该服务是一个CLIENT,因此有两个命令:install和configure。并且该服务还包括配置类型“ test-config”。
创建服务并将其添加到堆栈
- 在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
- 创建一个将包含名为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
- 浏览到新创建的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>
- 在上面,我的服务名称是“ TESTCONFIGSRV ”,它包含一个组件“ TESTCONFIG_CLIENT ”,它属于组件类别“ CLIENT ”。该客户端通过命令脚本进行管理scripts/test_client.py。接下来,让我们创建该命令脚本。
- 为我们在服务的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
- 浏览到脚本目录并创建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()
- 现在让我们为此服务定义一个配置类型。为配置字典文件创建目录/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
- 浏览到配置目录并创建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>
- 现在,重新启动Ambari Server,以将此新服务定义分发给群集中的所有代理。
ambari-server restart