如何在docker内搭建hadoop集群

直接使用机器部署hadoop集群十分痛苦,还没到运行wordcount,就被各种nodemanager、datanode、namenode之中各种出问题搞得头昏脑胀。为了寻找更简单的hadoop集群配置,查阅了不少资料,我想到了docker,用docker搭建一个hadoop集群,此帖技术内容并非原创,仅分享给大家。

 

项目参考了alvinhenrick/hadoop-mutinode项目,不过我做了大量的优化和重构。alvinhenrick/hadoop-mutinode项目的GitHub主页以及作者所写的博客地址如下:

  • GitHub:Hadoop (YARN) Multinode Cluster with Docker
  • 博客:Hadoop (YARN) Multinode Cluster with Docker

项目一共开发了4个镜像:

  • serf-dnsmasq
  • hadoop-base
  • hadoop-master
  • hadoop-slave

serf-dnsmasq镜像

  • 基于ubuntu:15.04 (选它是因为它最小,不是因为它最新)
  • 安装serf: serf是一个分布式的机器节点管理工具。它可以动态地发现所有Hadoop集群节点。
  • 安装dnsmasq: dnsmasq作为轻量级的DNS服务器。它可以为Hadoop集群提供域名解析服务。


容器启动时,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镜像 

  • 基于serf-dnsmasq镜像
  • 安装JDK(OpenJDK)
  • 安装openssh-server,配置无密码SSH
  • 安装vim:介样就可以愉快地在容器中敲代码了
  • 安装Hadoop 2.3.0: 安装编译过的Hadoop

hadoop-master镜像

  • 基于hadoop-base镜像
  • 配置hadoop的master节点
  • 格式化namenode

首先,拉取镜像

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

运行结果

start master container...
start slave1 container...
start slave2 container...
root@master:~# 

一共开启了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. 准备工作

  • 参考第二部分1~3:下载镜像,修改tag,下载源代码
  • 注意,你可以不下载serf-dnsmasq,但是请最好下载hadoop-base,因为hadoop-master是基于hadoop-base构建的。


2. 重新构建hadoop-master镜像
 

./resize-cluster.sh 5

 

  • 不要担心,1分钟就能搞定
  • 你可以为resize-cluster.sh脚本设不同的正整数作为参数数1, 2, 3, 4, 5, 6...


3. 启动容器
 

./start-container.sh 5

 

  • 你可以为start-container.sh脚本设不同的正整数作为参数数1, 2, 3, 4, 5, 6...
  • 这个参数呢,最好还是得和上一步的参数一致:)
  • 这个参数如果比上一步的参数大,你多启动的节点,Hadoop不认识它们..
  • 这个参数如果比上一步的参数小,Hadoop觉得少启动的节点挂掉了..


4. 测试工作

  • 参考第三部分5~7:测试容器,开启Hadoop,运行wordcount
  • 请注意,若节点增加,请务必先测试容器,然后再开启Hadoop, 因为serf可能还没有发现所有节点,而dnsmasq的DNS服务器表示还没有配置好服务
  • 测试等待时间取决于机器性能....

作者介绍
刘凯(KiwenLau):毕业于中国科学技术大学,目前在日本国立信息学研究所攻读云计算方向的博士学位,近期专注于Docker技术的研究。个人站点:GitHub, 博客

你可能感兴趣的:(数据挖掘)