直接使用机器部署hadoop集群十分痛苦,还没到运行wordcount,就被各种nodemanager、datanode、namenode之中各种出问题搞得头昏脑胀。为了寻找更简单的hadoop集群配置,查阅了不少资料,我想到了docker,用docker搭建一个hadoop集群,此帖技术内容并非原创,仅分享给大家。
项目参考了alvinhenrick/hadoop-mutinode项目,不过我做了大量的优化和重构。alvinhenrick/hadoop-mutinode项目的GitHub主页以及作者所写的博客地址如下:
项目一共开发了4个镜像:
serf-dnsmasq镜像
容器启动时,master节点的IP会传给所有slave节点。serf会在container启动后立即启动。slave节点上的serf agent会马上发现master节点(master IP它们都知道嘛),master节点就马上发现了所有slave节点。然后它们之间通过互相交换信息,所有节点就能知道其他所有节点的存在了。(Everyone will know Everyone)。serf发现新的节点时,就会重新配置dnsmasq,然后重启dnsmasq。所以dnsmasq就能够解析集群的所有节点的域名啦。这个过程随着节点的增加会耗时更久,因此,若配置的Hadoop节点比较多,则在启动容器后需要测试serf是否发现了所有节点,DNS是否能够解析所有节点域名。稍等片刻才能启动Hadoop。这个解决方案是由SequenceIQ公司提出的,该公司专注于将Hadoop运行在Docker中。
hadoop-base镜像
hadoop-master镜像
首先,拉取镜像
sudo docker pull index.alauda.cn/kiwenlau/hadoop-master:0.1.0
sudo docker pull index.alauda.cn/kiwenlau/hadoop-slave:0.1.0
sudo docker pull index.alauda.cn/kiwenlau/hadoop-base:0.1.0
sudo docker pull index.alauda.cn/kiwenlau/serf-dnsmasq:0.1.0
3~5分钟OK~也可以直接从原创作者的DokcerHub仓库中拉取镜像,这样就可以跳过第2步:
sudo docker pull kiwenlau/hadoop-master:0.1.0 sudo docker pull kiwenlau/hadoop-slave:0.1.0 sudo docker pull kiwenlau/hadoop-base:0.1.0 sudo docker pull kiwenlau/serf-dnsmasq:0.1.0
查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kiwenlau/hadoop 1.0 a59a34125272 2 years ago 829MB
kiwenlau/hadoop-slave 0.1.0 cbeb1a6de9e8 3 years ago 777MB
kiwenlau/hadoop-master 0.1.0 86c27cc8d9e5 3 years ago 777MB
kiwenlau/hadoop-base 0.1.0 f7fc429ed49d 3 years ago 777MB
kiwenlau/serf-dnsmasq 0.1.0 359ae1f3b69d 3 years ago 207MB
然后从github上下载源代码
git clone https://github.com/kiwenlau/hadoop-cluster-docker
下载完成后运行
cd hadoop-cluster-docker
./start-container.sh
运行结果
一共开启了3个容器,1个master, 2个slave。开启容器后就进入了master容器root用户的根目录(/root)。
查看master的root用户家目录的文件:
ls
运行结果:
hdfs run-wordcount.sh serf_log start-hadoop.sh start-ssh-serf.sh
start-hadoop.sh是开启hadoop的shell脚本,run-wordcount.sh是运行wordcount的shell脚本,可以测试镜像是否正常工作。
5.测试容器是否正常启动(此时已进入master容器)
查看hadoop集群成员:
serf members
运行结果:
master.kiwenlau.com 172.17.0.65:7946 alive slave1.kiwenlau.com 172.17.0.66:7946 alive slave2.kiwenlau.com 172.17.0.67:7946 alive
开启Hadoop
./start-hadoop.sh
若结果缺少节点,可以稍等片刻,再执行“serf members”命令。因为serf agent需要时间发现所有节点。
测试ssh:
ssh slave2.kiwenlau.com
运行wordcount
./run-wordcount.sh
运行结果:
input file1.txt: Hello Hadoop input file2.txt: Hello Docker wordcount output: Docker 1 Hadoop 1 Hello 2
wordcount的执行速度取决于机器性能....
N节点Hadoop集群搭建步骤
1. 准备工作
2. 重新构建hadoop-master镜像
./resize-cluster.sh 5
3. 启动容器
./start-container.sh 5
4. 测试工作
作者介绍
刘凯(KiwenLau):毕业于中国科学技术大学,目前在日本国立信息学研究所攻读云计算方向的博士学位,近期专注于Docker技术的研究。个人站点:GitHub, 博客