Ironfan

Serengeti中,有二个最重要最关的功能:一是虚拟机管理,即在vCenter中为一个Hadoop集群创建和管理所需要的虚拟机;另一个是集群软件安装配置管理,即在已安装好操作系统的虚拟机上安装Hadoop相关组件(包括Zookeeper,Hadoop,Hive,Pig等),更新配置文件(例如Namenode/Jobtracker/Zookeeper结点的IP等信息),然后启动Hadoop服务。Ironfan就是在Serengeti中负责集群软件安装配置管理的组件。

Ironfan是基于Chef术开发的集群软件部署配置管理工具Chef是一个类似于Puppet和CFEngine的开源的系统配置管理工具,它定义了一套简单易用的DSL(Domain Specific language)语言用于在一台已安装好基本操作系统的机器上安装配置任意软件和配置系统本身。Ironfan基于Chef的框架和API提供了简单易用的自动化部署和管理集群的命令行工具。Ironfan支持部署Zookeeper,Hadoop和HBase集群,也可以编写新的cookbook以部署任意其他非Hadoop集群。

Ironfan最初由美国一家Big Data初创公司Infochimps使用Ruby语言开发,并在github.com上以Apache Licensev2开源。最开始Ironfan只支持在Amazon EC2的Ubuntu虚拟机上部署Hadoop集群。VMwareProject Serengeti团队选择了基于Ironfan来开发Big Data集群工具,并实现了一系列重大改进,让Ironfan可以在VMware vCenter中的CentOS 5.x虚拟机上创建部署Hadoop集群。ProjectSerengeti改进后的Ironfan同样以Apache License v2在github.com上开源,供用户免费下载和修改。

Ironfan架构

Ironfan的架构。Ironfan主要包括Cluster OrchestrationEngine,VM Provision Engine,SoftwareProvision Engine和用于存数据的Chef Server 和Package Server。


·ClusterOrchestration Engine:Ironfan的总控制器,负责加载解析集群定义文件,创建虚拟机,在ChefServer中保存集群的配置信息,并调用Chef REST API为各个虚拟机创建对应的ChefNode和Chef Client, 并设定各个虚拟机的ChefRole。

·VMProvision Engine:cluster中的所有虚机,并等待虚机得到IP。VM Provision Engine提供了接口以支持在各种虚机云境中建虚机,目前实现Amazon EC2和VMware vCenter的支持。在Serengeti中,所有虚机由Ironfan的用者在VMware vCenter中建,并将IP保存在cluster spec文件中,传递给Ironfan的VM Provision Engine。

·SoftwareProvision Engine: 使用虚拟机中预先创建好的缺省用户名和密码,SSH远程登到所有虚机中同时启动chef-client来安装件。chef-client是Chef框架中的代理程序,负责在其运行的结点上执行预先由Chef Role指定的安装配置脚本。chef-client也会将执行进度数据保存在Chef Server中。

·ChefServer:用于存Chef  Nodes,Chef Clients, Chef Roles, Chef Cookbooks, 提供Chef RESTAPI, 是Chef框架的重要成部件。

·PackageServer:用于存储所需的Hadoop和其他Hadoop所依赖的安装包。


Ironfan外提供了Knife CLI命令行接口,其用者(即SerengetiWeb Service 件)建单独进程调用Knife CLI,通过进程退出状态值判断成功或者失败。具体的集群结点数据和执行进度信息由调用者随时从ChefServer获取。

Ironfan在大数据集群部署、配置管理中的应用

IronfanKnife CLI

每一个SerengetiCLI cluster命令都一个IronfanKnife CLI命令,包括create (创建集群)、list(查看集群)、config(配置集群)、stop(停止集群)、start(启动集群)、delete(删除集群)。

clustercreate => knife cluster create <cluster_name> -f/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json--yes --bootstrap

clusterlist => knife cluster show <cluster_name> -f/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json--yes

clusterconfig => knife cluster bootstrap <cluster_name> -f/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json--yes

clusterstop => knife cluster stop <cluster_name> -f/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json--yes

clusterstart => knife cluster start <cluster_name> -f/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json–yes --bootstrap

clusterdelete => knife cluster kill <cluster_name> -f/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json--yes


其中参数/opt/serengeti/logs/task/<task_id>/<step_id>/<cluster_name>.json是Serengeti Web Service传递给Ironfan的cluster spec文件,是一个JSON格式的文件,包含了集群的点分点个数、件定描述、集群的配置、PackageServer和所有虚机的名称和IP等信息。Ironfan会分析cluster spec文件,生成Ironfan所需要的cluster定文件并保存在/opt/serengeti/tmp/.ironfan-clusters/<cluster_name>.rb。

Ironfancluster文件 (DSL, roles)

接下来,我看看Ironfan是如何定集群的。下是一个名demo的cluster的定文件demo.rb,它是一个Ruby文件,用Ironfan所定DSL言描述集群的组成结构,定义了3个虚拟机组。其中每一个facet定义了一个虚拟机组,包含若干个安装同样软件的虚拟机。每个分组中结点个数由instance指定,虚拟机上要安装的软件由role指定。这个role就是Chef中所定义的role。

Ironfan在大数据集群部署、配置管理中的应用

Chef Roles Cookbooks

Serengeti中所有Chef Role文件存放于/opt/serengeti/cookbooks/roles/*.rb所有

Chef Cookbook 文件存放于/opt/serengeti/cookbooks/cookbooks/


hadoop_namenode role例,/opt/serengeti/cookbooks/roles/hadoop_namenode.rb 内容如下:

name 'hadoop_namenode'

description 'runs a namenode infully-distributed mode. There should be exactly one of these per cluster.'


run_list %w[

  role[hadoop]   # 一个role可以包含引用另一个role

  hadoop_cluster::namenode   # hadoop_cluster 是一个cookbook, namenodecookbook中的一个recipe

]


如果者需要修改调试 role和cookbook,可在修改role和cookbook 文件后,运行以下命令上传role和cookbook:

knife role from file/opt/serengeti/cookbooks/roles/<role_name>.rb –V

knifecookbook upload <cookbook_name> -V

Cluster Service Discovery

在集群部署过程之中,有些组件的安装和服务的启动顺序是有先后依赖的,比如Datanode服务需要在Namenode服务启动之后再启动,Tasktracker服务需要在Jobtracker服务启动之后再启动,并且这些服务通常不在同一个虚拟机上。因此Ironfan在部署过程中需要控制不同结点上服务的安装和启动顺序,让有依赖关系的结点同步。Ironfan是使用一个名为cluster_service_discovery的cookbook实现相关结点之间同步。

cluster_service_discoverycookbook定义了provide_service,provider_fqdn,provider_fqdn_for_role,all_providers_for_service等等方法,用于实现结点同步。我们以datanode服务需要等待namenode服务启动为例讲解如何实现同步:

·namenoderecipe中,启动namenode服务之后,调用provide_service(node[:hadoop][:namenode_service_name]),向Chef Server把此结点注册为namenode 服务的提供者;

·datanoderecipe中,启动datanode服务之前,调用provider_fqdn(node[:hadoop][:namenode_service_name])向Chef Server查询namenode服务提供者的FQDN(或IP); provider_fqdn方法会每隔5秒种向Chef Server查询一次,直到查询到结果,或者30分钟后超时报错。


其他相关点的同步也与此机制相似,例如Zookeeper结点之间的相互等待,HBase结点等待Zookeeper结点,具体方法调用可查看cluster_service_discoveryzookeeper,hadoop, 和hbase cookbook的源代码。


关于vSphere Big Data Extensions:

VMware vSphere Big Data Extensions(简称BDE)基于vSphere平台支持大数据和Apache Hadoop作业。BDE以开源Serengeti项目为基础,为企业级用户提供一系列整合的管理工具,通过在vSphere上虚拟化Apache Hadoop,帮助用户在基础设施上实现灵活、弹性、安全和快捷的大数据部署、运行和管理工作。了解更多关于VMware vSphere Big Data Extensions的信息,请参见http://www.vmware.com/hadoop


作者介绍

Ironfan在大数据集群部署、配置管理中的应用

胡辉 (Jesse Hu)

VMware高级开发工程师

担任VMware大数据产品vSphere BDE和Serengeti开源项目的技术带头人之一,是Serengeti开源项目最早期的开发者,并实现了第一个原型系统,是Serengeti集群软件安装配置管理模块Ironfan的设计者。在加入VMware之前,曾就职于Yahoo,IBM,Oracle等多家IT企业,对开源社区,云计算, Mobile, SNS, Web 2.0, Ruby都有了解和研究。