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