使用Docker搭建部署Hadoop分布式集群
在网上找了很长时间都没有找到使用docker搭建hadoop分布式集群的文档,没办法,只能自己写一个了。
一:环境准备:
1:首先要有一个Centos7操作系统,可以在虚拟机中安装。
2:在centos7中安装docker,docker的版本为1.8.2
安装步骤如下:
<1>安装制定版本的dockeryum install -y docker-1.8.2-10.el7.centos
<2>安装的时候可能会报错,需要删除这个依赖
- 1
- 1
启动docker
- 1
- 1
验证安装结果:
<3>启动之后执行docker info会看到下面有两行警告信息
需要关闭防火墙并重启系统
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
<4>运行容器可能会报错
需要关闭selinux
解决方法:
- 1
- 2
- 3
- 1
- 2
- 3
3:需要先构建一个hadoop的基础镜像,使用dockerfile文件方式进行构建。
先构建一个具备ssh功能的镜像,方便后期使用。(但是这样对于容器的安全性会有影响)
注意:这个镜像中的root用户的密码是root
Mkdir centos-ssh-root
Cd centos-ssh-root
Vi Dockerfile
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
构建命令:
docker build -t=”crxy/centos-ssh-root” .
查询刚才构建成功的镜像
4:基于这个镜像再构建一个带有jdk的镜像
注意:jdk使用的是1.7版本的
Mkdir centos-ssh-root-jdk
Cd centos-ssh-root-jdk
Cp ../jdk-7u75-linux-x64.tar.gz .
Vi Dockerfile
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
构建命令:
docker build -t=”crxy/centos-ssh-root-jdk” .
查询构建成功的镜像
5:基于这个jdk镜像再构建一个带有hadoop的镜像
注意:hadoop使用的是2.4.1版本的。
Mkdir centos-ssh-root-jdk-hadoop
Cd centos-ssh-root-jdk-hadoop
Cp ../hadoop-2.4.1.tar.gz .
Vi Dockerfile
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
构建命令:
docker build -t=”crxy/centos-ssh-root-jdk-hadoop” .
查询构建成功的镜像
二:搭建hadoop分布式集群
1:集群规划
准备搭建一个具有三个节点的集群,一主两从
主节点:hadoop0 ip:192.168.2.10
从节点1:hadoop1 ip:192.168.2.11
从节点2:hadoop2 ip:192.168.2.12
但是由于docker容器重新启动之后ip会发生变化,所以需要我们给docker设置固定ip。使用pipework给docker容器设置固定ip
2:启动三个容器,分别作为hadoop0 hadoop1 hadoop2
在宿主机上执行下面命令,给容器设置主机名和容器的名称,并且在hadoop0中对外开放端口50070 和8088
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
使用docker ps 查看刚才启动的是三个容器
3:给这三台容器设置固定IP
1:下载pipework
下载地址:https://github.com/jpetazzo/pipework.git
2:把下载的zip包上传到宿主机服务器上,解压,改名字
- 1
- 2
- 3
- 1
- 2
- 3
3:安装bridge-utils
- 1
- 1
4:创建网络
- 1
- 2
- 3
- 1
- 2
- 3
5:给容器设置固定ip
- 1
- 2
- 3
- 1
- 2
- 3
验证一下,分别ping三个ip,能ping通就说明没问题
4:配置hadoop集群
先连接到hadoop0上,
使用命令
- 1
- 1
下面的步骤就是hadoop集群的配置过程
1:设置主机名与ip的映射,修改三台容器:vi /etc/hosts
添加下面配置
- 1
- 2
- 3
- 1
- 2
- 3
2:设置ssh免密码登录
在hadoop0上执行下面操作
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
3:在hadoop0上修改hadoop的配置文件
进入到/usr/local/hadoop/etc/hadoop目录
修改目录下的配置文件core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml
(1)hadoop-env.sh
- 1
- 1
(2)core-site.xml
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
(3)hdfs-site.xml
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
(4)yarn-site.xml
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
(5)修改文件名:mv mapred-site.xml.template mapred-site.xml
vi mapred-site.xml
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
(6)格式化
进入到/usr/local/hadoop目录下
1、执行格式化命令
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
看到下面命令说明格式化成功。
格式化操作不能重复执行。如果一定要重复格式化,带参数-force即可。
(7)启动伪分布hadoop
- 1
- 1
第一次启动的过程中需要输入yes确认一下。
使用jps,检查进程是否正常启动?能看到下面几个进程表示伪分布启动成功
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
(8)停止伪分布hadoop
- 1
- 1
(9)指定nodemanager的地址,修改文件yarn-site.xml
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
(10)修改hadoop0中hadoop的一个配置文件etc/hadoop/slaves
删除原来的所有内容,修改为如下
- 1
- 2
- 1
- 2
(11)在hadoop0中执行命令
- 1
- 2
- 1
- 2
(12)启动hadoop分布式集群服务
- 1
- 1
注意:在执行的时候会报错,是因为两个从节点缺少which命令,安装即可
分别在两个从节点执行下面命令安装
- 1
- 1
再启动集群(如果集群已启动,需要先停止)
- 1
- 1
(13)验证集群是否正常
首先查看进程:
Hadoop0上需要有这几个进程
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
Hadoop1上需要有这几个进程
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
Hadoop2上需要有这几个进程
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
使用程序验证集群服务
创建一个本地文件
- 1
- 2
- 3
- 1
- 2
- 3
上传a.txt到hdfs上
- 1
- 1
执行wordcount程序
- 1
- 2
- 1
- 2
查看程序执行结果
这样就说明集群正常了。
通过浏览器访问集群的服务
由于在启动hadoop0这个容器的时候把50070和8088映射到宿主机的对应端口上了
- 1
- 1
所以在这可以直接通过宿主机访问容器中hadoop集群的服务
宿主机的ip为:192.168.1.144
- 1
- 2
- 1
- 2
三:集群节点重启
停止三个容器,在宿主机上执行下面命令
- 1
- 2
- 3
- 1
- 2
- 3
容器停止之后,之前设置的固定ip也会消失,重新再使用这几个容器的时候还需要重新设置固定ip
先把之前停止的三个容器起来
- 1
- 2
- 3
- 1
- 2
- 3
在宿主机上执行下面命令重新给容器设置固定ip
- 1
- 2
- 3
- 1
- 2
- 3
还需要重新在容器中配置主机名和ip的映射关系,每次都手工写比较麻烦
写一个脚本,runhosts.sh
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
添加执行权限,chmod +x runhosts.sh
把这个脚本拷贝到所有节点,并且分别执行这个脚本
- 1
- 2
- 1
- 2
执行脚本的命令 ./runhosts.sh
查看/etc/hosts文件中是否添加成功
注意:有一些docker版本中不会在hosts文件中自动生成下面这些映射,所以我们才在这里手工给容器设置固定ip,并设置主机名和ip的映射关系。
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
启动hadoop集群
- 1
- 1