当前位置: 首页 > 架构/云 > 基于虚拟linux+docker搭建hadoop完全分布式集群

基于虚拟linux+docker搭建hadoop完全分布式集群

  • 分类:架构/云
  • 本文标签: Docker
  • 发布时间:2017-01-09 22:36:47
  • 查看数: 3

本文假设用户基本了解docker,掌握linux的基本使用命令,了解hadoop的常规安装及简单配置

实验环境:windows10+Vmware WorkStation 11+Linux.14.04 server+docker 1.7

windows 10作为实体机操作系统,网段为:10.41.0.0/24,虚拟机使用NAT网络,子网为192.168.92.0/24,网关为192.168.92.2,linux 14.04为虚拟系统,充当容器的宿主机,IP为192.168.92.129。本文将基于以上环境在linux系统中搭建一个hadoop完全分布式集群,节点组成为master+slave1+slave2

一、虚拟系统安装

windows10上安装vmware workstation,并创建一个linux虚拟机,根据机器的性能分配磁盘空间、CPU和内存,网络类型为NAT(根据实际网络环境选择,此处网络上教程丰富,不再赘述),安装linux时选择安装类型为SSH服务器。

安装完Linux虚拟系统后,在vmware workstation的网络编辑器中可看到虚拟机分配的子网为192.168.92.0/24@192.168.92.2,在虚拟机终端执行ifconfig可看到linux自动获取到的IP为192.168.92.129编辑/etc/network/interfaces文件,配置静态IP地址:

执行命令使网络配置生效:

sudo /etc/init.d/networking restart #有时候该命令没什么效果,重启一下吧

使用linux远程管理工具(如xshell、putty)登录linux系统


二、安装docker

参考该链接安装docker: 


三、获取镜像

从docker仓库下载ubuntu14.04的镜像(文件不大,不到200MB)

sudo docker pull ubuntu:14.04 #下载镜像
sudo docker images #查看本地仓库中的镜像


最下面的14.04是下载的镜像,其他均为在此镜像基础上commit得到的新镜像


四、定制容器

执行如下命令创建并启动一个容器:

sudo docker run -ti ubuntu:14.04

此时会切换到容器的临时终端,默认直接进入root用户环境,接着做如下工作:

1、修改安装源,因为docker pull得到的镜像使用的是国外的安装源,在使用该安装源下执行apt-get install 操作时下载阶段会特别慢甚至下载不成功,建议替换成国内的源,如cn99、网易等,也可参考宿主机的源配置(它访问的是ubuntu部署在国内的服务器),找到新源后替换 /etc/apt/sources.list 文件即可。

2、安装ssh

sudo apt-get update
sudo apt-get install openssh-server

3、配置ssh免密登录

在用户目录下创建.ssh文件夹,执行命令:

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

接着修改ssh的配置文件(/etc/ssh/sshd_config),将PermitRootLogin without-password 改成PermitRootLogin yes,之后修改root密码。

如果不想允许root直接登录,则需要自己创建一个用户,所有操作都在该用户环境下进行。
4、下载安装JDK

sudo apt-get install oracle-java8-installer #也可使用wget直接从oracle官网下载

下载后配置JDK环境变量,执行java、javac命令进行测试。

5、配置hosts

按照上文实验环境的描述,hadoop集群由一个master节点和两个slave节点组成,需要在hosts文件中添加IP到主机名的映射,执行ifconfig命令可以看到docker给容器分配的eth0网卡的IP为172.17.0.x网段(不同的环境该私有IP段可能不同),且重启容器后该IP会变动,而hadoop集群最好配置静态的地址,在后续步骤中,将会用到一个工具给容器虚拟一个新的网卡,同时分配一个固定的地址,该地址和docker服务在宿主机中创建的网桥docker0的地址为同一网段。

重新开启一个远程管理终端程序登录linux宿主机,执行ifconfig命令可以到docker0网桥的IP(本文的实验环境为172.17.42.1),且每次重启系统,该IP均不变化,因而可以在该网段给容器分配IP,这里做如下分配:

172.17.42.2 master
172.17.42.3 slave1
172.17.42.4 slave2

需要注意的是,容器在启动后会初始化hosts文件,且会自行添加一条eth0网卡地址到主机名的映射,这会导致hadoop集群启动后监听的网卡为eth0,所以需要重新生成该文件,这里提供一个简单的脚本做这项工作:

#!/bin/bash
echo "#ip and hostname information" > /etc/hosts
echo "127.0.0.1 localhost" >> /etc/hosts
echo "172.17.42.2 master" >> /etc/hosts
echo "172.17.42.3 slave1" >> /etc/hosts
echo "172.17.42.4 slave2" >> /etc/hosts

将脚本添加到开机启动即可。

6、下载配置hadoop

使用wget下载hadoop2.6(可根据实际情况选择想要安装的版本):

wget http://mirrors.sonic.net/apache/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz

将压缩包解压到某个目录,然后编辑hadoop-2.6.0/etc/hadoop目录下的配置文件,修改相应配置。


五、保存镜像

执行exit命令退出容器终端,然后执行命令保存对容器的更改到一个新的镜像:

sudo docker commit -m "description information about the images" <容器ID> ubuntu:hadoop

六、创建并启动新容器

执行命令创建并启动新的hadoop集群容器:

sudo docker run -d -h master --name=hadoop_master ubuntu:hadoop /usr/sbin/sshd -D #启动hadoop主节点
sudo docker run -d -h slave1 --name=hadoop_slave1 ubuntu:hadoop /usr/sbin/sshd -D #启动hadoop从节点
sudo docker run -d -h slave2 --name=hadoop_slave2 ubuntu:hadoop /usr/sbin/sshd -D #启动hadoop从节点
sudo docker ps -a #查看所有创建的容器



七、安装pipework工具并创建虚拟网卡

1、从gitub上下载一个名叫pipework的工具,地址为:

该工具主要是给容器虚拟一张新的网卡,给网卡配置静态地址,同时把新网卡和docker在宿主机中创建的网桥桥接起来,使得容器和宿主机能通过该网卡互通。

下载并解压该工具,然后拷贝解压目录下的pipework文件至/usr/local/bin目录,至此,工具安装完毕。

2、创建虚拟网卡

执行如下命令给三个容器创建指定地址的虚拟网卡:

sudo pipework docker0 hadoop_master 172.17.42.2/24@172.17.42.1
sudo pipework docker0 hadoop_slave1 172.17.42.3/24@172.17.42.1
sudo pipework docker0 hadoop_slave2 172.17.42.4/24@172.17.42.1

该命令参数为:<网桥名称> <容器名称> <新网卡地址/网络号@网关地址>,网关就是网桥的地址,默认创建的网卡名称为eth1,可通过<-i name>参数指定网卡名称。执行该命令时可能会有警告信息,目前没发现有什么影响。


八、访问测试

在宿主机中ping容器的新网卡地址,发现三个节点均测试通过,在宿主机中使用ssh命令也可正确登录容器。



九、启动hadoop集群

登录容器的master节点后,执行命令格式化namenode节点,然后启动集群:

bin/hadoop namenode -format
sbin/start-dfs.sh && sbin/start-yarn.sh

结果如下:



至此,已经可以从宿主机访问容器了,但是宿主机是没有桌面环境,只能通过实体机在浏览器中访问集群提供的web UI,但现在实体机无法ping通容器地址,也无法访问容器,原因在于,宿主机是实体机的子网,容器是宿主机的子网,而实体机不知道容器所在子网的存在,所以需要在实体机中添加一条从实体机到容器子网的路由。

用管理员模式运行cmd,执行如下命令:

route add -p 172.17.42.0 mask 255.255.255.0 192.168.92.129

三个地址分别为:<目的子网地址> <掩码地址> <网关/宿主机地址>,之后,在实体机中可以正常ping通容器,web控制台也能正常打开了。


说明:docker容器每次重启后,pipework工具创建的虚拟网卡会消失,需要重新分配,可写个脚本管理之。

文章来源于网络

转载时请以 超链接的形式 注明:转自疯狂泰克