基于Kickstart的Hadoop集群自动化部署

基于Kickstart & PXE的CentOS无人值守安装 一文中,介绍了一种高度自动化的RedHat Linux安装方式。由于Kickstart支持脚本,利用Kickstart技术也可以实现Hadoop集群的自动化部署。本文试构建一种利用Kickstart脚本根据资源分配文件自动化部署Hadoop集群的方案。

Kickstart配置文件结构

Kickstart文件由三部分按规定顺序组成,每部分内部没有顺序要求。三部分按顺序分别为:[1]

  • 命令部分,这里应该包括必需的选项.
  • %packages部分,这部分选择需要安装的软件包.
  • %pre和%post部分,这两个部分可以按任何顺序排列而且不是必需的.

Ret Hat系列的Linux在安装过程中,Anaconda安装管理程序会创建一个简单的Kickstart文件,保存为/root/anaconda-ks.cfg。可以直接修改该文件来创建我们自己的Kickstart配置文件。下面是文本用到的基础Kickstart文件:

该文件并未包含%post脚本,将会在后文用脚本添加。

%pre是Kickstart预安装脚本,可以在ks.cfg文件被解析后马上加入要运行的命令.这个部分必须处于kickstart文件的最后(在命令部分之后)而且必须用%pre命令开头.可以在%pre部分访问网络;然而,此时命名服务还未被配置,所以只能使用IP地址。需要注意的是,预安装脚本不在改换了的根环境(chroot)中运行。

%pre部分常用选项
--interpreter /usr/bin/python,允许指定不同的脚本语言,如Python.把/usr/bin/python替换成想使用的脚本语言. [2]

%post部分是安装后脚本,这部分内容必须在kickstart的最后而且用%post命令开头.它被用于实现某些功能,如安装其他的软件和配置其他的命名服务器.
需要注意的是,如果用静态IP信息和命名服务器配置网络,可以在%post部分访问和解析IP地址.如果使用DHCP配置网络,当安装程序执行到%post部分时,/etc/resolv.conf文件还没有准备好.此时,可以访问网络,但是不能解析IP地址.因此,如果使用DHCP,必须在%post部分指定IP地址.另外,post-install 脚本是在 chroot 环境里运行的.因此,某些任务如从安装介质复制脚本或RPM将无法执行. [3]
%post部分常用选项:

--nochroot #允许指定想在chroot环境之外运行的命令.
下例把安装介质中的/etc/resolv.conf文件复制到刚安装的文件系统里.

--interpreter /usr/bin/python #允许指定不同的脚本语言,如Python.把/usr/bin/python替换成想使用的脚本语言.
--log=/tmp/post-install.log #指定post脚本执行日志的保存路径

本文利用post脚本实现Hadoop集群的安装与自动配置。

Hadoop集群资源分配文件结构

资源分配文件用于Hadoop集群的网络资源分配。post脚本根据本机MAC地址查找资源分配文件,获取本机的主机名、IP地址等信息,然后自动配置。其中MAC地址需要事先知道,服务器一般厂商会提供。虚拟机需要自己指定。这里注意,VMware中不要用自动生成MAC地址功能,生成的 00:50:56开头的一开机就会变成00:0C:29,所以需要手动指定以 00:0C:29开头的MAC地址。

一个示例资源分配文件

自动化部署方案

首先需要搭建能够进行Hadoop集群安装配置的PXE Installer服务器。该服务器提供Hadoop所需软件包、资源配置文件及Hadoop安装脚本[4]。本次实验集群中的每台机器都被配置为rsync服务器,以便同步Master的公钥文件。

拓扑结构如图所示:

Kickstart部署Hadoop拓扑结构

Kickstart部署Hadoop拓扑结构

部署流程图

PXE自动部署Hadoop流程图

PXE自动部署Hadoop流程图

实施部署

为PXE服务器配置脚本添加选项

修改 PXE服务器配置脚本,添加参数选项,增加配置Hadoop自动部署的函数。

根据参数将PXE Installer配置成不同类型,-d 为default,即Centos自动安装服务器,-h为Hadoop自动部署服务器。他们的不同主要是ks文件的不同。选项为-h时配置适用于Hadoop自动部署的ks文件。

自动配置Hadoop ks文件

向默认的ks文件添加部署Hadoop的post脚本。用 cat > ks.cfg <<eof写入,注意变量需要转义。主要有以下步骤。

根据资源分配文件配置网络信息

首先获取本机的MAC地址,然后以MAC地址为索引找到本机的IP,掩码,网关,主机名等信息,然后自动配置。脚本还配置了集群机器的hosts文件,添加集群所有主机的A记录。

 安装Hadoop

这里比较简单,直接从Installer下载软件包和安装脚本,运行安装脚本即可。

 配置rsync服务

slave需要同步master的密钥,可以在master上配置允许匿名访问的rsync服务器[5],然后在slave上拉取master公钥。

 同步master公钥

将master的公钥文件id_dsa.pub复制到rsync服务器目录,slave拉取即可。这里涉及到一个失败重传的过程,由于slave可能早于master的安装进程,当slave执行到拉取密钥的时候,master可能还没有准备好密钥。脚本设置slave如果拉取公钥失败,则等待5s后重试,共重试100次。因此请尽量保证master早于slave。另外,像集群添加新的slave时,请保持master为开机状态。

 Hadoop集群配置

涉及到core-site.xml,hdfs-site.xml,mapred-site.xml几个文件的配置,及masters,slaves的配置[6]。这里需要注意,像集群新加slave时,请直接在资源分配文件末尾添加。新加集群存在masters,slaves及hosts文件不同步的问题,可以考虑用cfengine或者puppet,待后续解决。

集群验证测试

第一次启动Hadoop时,需要格式化Hadoop的HDFS,执行:

然后启动Hadoop,执行

宿主机中,编辑hosts文件,加入Hadoop集群主机的IP记录:

然后用浏览器访问 http://master:50070和http://master:50030

Jobtracker

Jobtracker

 

NameNode

NameNode

测试mapreduce程序,本地创建几个文本文件,上传到HDFS上:

用浏览器 查看HDFS上的文件

浏览HDFS文件

浏览HDFS文件

执行Wordcount

用浏览器查看

runningjobs

运行中的任务

completjobs

完成的任务

查看结果

用浏览器查看结果

result

Wordcount执行结果

遇到的问题

 去除M-oM-;M-?

用notepad++,编码为 utf8无BOM即可

rsync 提示 no route to master

密钥总是拉取失败,rsync无法连接master。通过添加调试代码发现在post脚本中设置完网络信息之后需要重启网络。因为虽然hosts中存在集群中各主机的IP信息,但是没有重启网络之前各主机的IP仍然是从PXE服务器那里自动获取的。这里涉及到时序的问题,因为slave要访问master,master需要先配置完网络并重启网络后才能被slave访问到。所以slave需要等待master配置完成。脚本设置最多等待100x5s,即500s。

另外防火墙也可能导致rsync失败,可以在ks文件中直接关闭防火墙。[7]

 ssh登录时提示"是否要添加HostKey"

ssh登录某台机器的时候,如果这台机器从来没有使用ssh登录过(严格来说应该是~/.ssh/known_hosts文件中没有这台机器的HostKey),那么,ssh会产生一个提示,询问是否需要添加这台机器的HostKey,回答yes/no即可,虽然只要不删除~/.ssh/known_hosts文件中该机器的HostKey,则这个提示将不会出现,但是如果我们需要书写一些自动化脚本的时候,这就会成为问题。
man了一下ssh_config,发现有解决的办法:创建文件~/.ssh/config,添加一行:
StrictHostKeyChecking no
即可。以后ssh将会自动添加HostKey到~/.ssh/known_hosts,不会再询问。默认该项配置是ask,所以会询问。如果配置成yes,则每次必须手动将hostkey添加到~/.ssh/known_hosts文件中,这是最严格的配置。[8]

参考资料

[1]. ChinaUnix博客. http://blog.chinaunix.net/uid-17240700-id-2813881.html
[2]. ChinaUnix博客. http://blog.chinaunix.net/uid-17240700-id-2813881.html
[3]. ChinaUnix博客. http://blog.chinaunix.net/uid-17240700-id-2813881.html
[4]. 知行近思. http://www.annhe.net/article-2672.html
[5]. CSDN博客. http://blog.csdn.net/zombee/article/details/6793672
[6]. 陆嘉桓. Hadoop实战 第二版
[7]. ChinaUnix博客. http://blog.chinaunix.net/uid-17240700-id-2813881.html
[8]. 163博客. http://blog.163.com/kartwall@126/blog/static/8942370200831485241268/

附录

完整代码

详见github:https://github.com/annProg/paper/blob/master/code/init_pxeserver.sh

扩展阅读

[1]. MORE-Kickstart-Tips-and-Tricks. Tricks.
http://www.redhat.com/promo/summit/2010/presentations/summit/decoding-the-code/wed/cshabazi-530-more/MORE-Kickstart-Tips-and-Tricks.pdf

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注