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. 配置服务
安装成功