基于Docker搭建Hadoop集群
一、准备工作
下载VMware、Xshell、Xftp、centos7映像文件、hadoop和jdk的压缩包。
二、配置虚拟机
1.创建虚拟机
使用VMware新建虚拟机,同时安装centos7系统,命名为master。
2.给虚拟机配置IP、网关等
vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改BOOTPROTO为static,并在最后添加虚拟机的IP地址,子网掩码、网关和DNS等,如下图。

保存后退出。
重启网络服务,测试能否ping通百度,可以则配置成功,如下图。

3.关闭防火墙
查看此时防火墙的状态。
systemctl status firewalld

发现此时防火墙开启,所以将其关闭,并设置永久关闭。
systemctl stop firewalld
systemctl disable firewalld
此时再查看防火墙的状态,发现已关闭。(若要测试是否永久关闭可以重启后查看)

4.补充:找不到ifconfig命令(可用于查看IP)
进行如下操作即可。

5.使用xshell连接虚拟机

选择“接受并保存”,然后输入用户名和密码即可。

6.修改主机名
若第一步未命名虚拟机,可通过如下命令。
vi /etc/hostname
输入名字,保存后退出。然后重启,命名生效。
三、安装docker服务
1.自动安装docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
2.查看docker的版本

3.启动docker,并设置开机自启动

4.配置docker镜像加速器
vi /etc/docker/daemon.json
添加如下内容

保存后退出。
5.重启docker服务
systemctl daemon-reload
systemctl restart docker
输入docker info,最下方显示我们配置的地址时即为成功配置镜像加速器,如下图。

四、安装pipework和bridge-utils
1.新建文件夹software
mkdir software
cd software
2.安装git
yum install -y git
3.下载pipework
git clone https://github.com/jpetazzo/pipework.git
下载完成。

4.把pipework脚本添加到path中
cp pipework/pipework /usr/bin/
5.安装bridge-utils
yum install bridge-utils
五、搭建集群(一)
1.集群规划
| hadoop01 | hadoop02 | hadoop03 | |
| IP | 192.168.19.201 | 192.168.19.202 | 192.168.19.203 |
| HDFS | NameNode、DataNode | DataNode | SecondaryNode、DataNode |
| YARN | NodeManager | ResourceManager、NodeManager | NodeManager |
2.拉取centos镜像
cd ~
docker pull centos:7.5.1804
查看镜像

3.创建文件夹docker-hadoop
mkdir docker-hadoop
4.使用xftp连接master,并传输jdk安装包到文件夹docker-hadoop

选中jdk压缩包,直接拖拽过去即可。
5.编辑Dockerfile,通过其生成带有jdk、ssh服务的镜像
cd docker-hadoop
vi Dockerfile
添加如下内容。
FROM centos
MAINTAINER master
#安装JDK
RUN mkdir -p /opt/software && mkdir -p /opt/service
ADD jdk1.8.0_221.tar.gz /opt/service
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum makecache
RUN yum update -y
RUN yum install -y openssh-server sudo
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN yum install -y openssh-clients
RUN echo "root:1" | chpasswd
RUN echo "root ALL=(ALL) ALL" >> /etc/sudoers
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
注:MAINTAINER+空格+作者的信息,用于指定镜像作者的信息,根据自身实际修改。“root:1”的冒号后改成自己的密码。
6.生成基础镜像
docker build -t hadoopbase:1.0 ./
查看镜像是否创建成功。

六、搭建集群(二)
1.创建三个容器
docker create -it --name hadoop01 -h hadoop01 hadoopbase:1.0
docker create -it --name hadoop02 -h hadoop02 hadoopbase:1.0
docker create -it --name hadoop03 -h hadoop03 hadoopbase:1.0
2.pipework配置网络
cd /usr/local/bin
vi docker.sh
chmod 777 docker.sh
脚本内容如下
#!/bin/bash
# 启动容器
docker start hadoop01
docker start hadoop02
docker start hadoop03
# 搭建网桥
brctl addbr br0; \
ip link set dev br0 up;
ip addr del 192.168.19.144/24 dev ens33;\
ip addr add 192.168.19.144/24 dev br0; \
brctl addif br0 ens33;\
ip route add default via 192.168.19.1 dev br0
#睡5秒钟
sleep 5
#给容器配置ip和网关
pipework br0 hadoop01 192.168.19.201/24@192.168.19.1
pipework br0 hadoop02 192.168.19.202/24@192.168.19.1
pipework br0 hadoop03 192.168.19.203/24@192.168.19.1
3.执行脚本

显示如上则说明容器启动成功。
4.使用xshell连接三个容器

编辑容器的hosts文件,配置主机映射。
vi /etc/hosts
删除最后一行,添加以下内容。
192.168.19.201 hadoop01
192.168.19.202 hadoop02
192.168.19.203 hadoop03
保存后退出。可测试能否通过主机名ping通,从而判断配置是否生效。
5.配置三个容器之间的免密登录
此时仅在hadoop01上操作。
ssh-keygen -t rsa
三次回车。
ssh-copy-id hadoop01
ssh-copy-id hadoop02
ssh-copy-id hadoop03
依次执行,需要输入“yes”和自己设置的密码。
然后在hadoop02和hadoop03上执行相同的操作。
七、搭建集群(三)
1.使用xftp连接hadoop01,上传hadoop安装包,放在/opt/software下

2.解压hadoop的安装包到/opt/service下
tar -zxvf hadoop-2.7.7.tar.gz -C /opt/service
3.配置jdk和hadoop的环境变量
vi /etc/profile
添加以下内容
#JAVE_HOME
export JAVA_HOME=/opt/service/jdk1.8.0_221
export PATH=$PATH:$JAVA_HOME/bin
#HADOOP_HOME
export HADOOP_HOME=/opt/service/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
使文件生效
source /etc/profile
查看jdk和hadoop的版本

4.修改hadoop的配置文件
进入对应的文件夹
cd /opt/service/hadoop-2.7.7/etc/hadoop/
(1)修改core-site.xml
vi core-site.xml
在<configuration></configuration>间添加以下内容,保存后退出。
<!--指定NameNode的地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<!--指定hadoop存放数据的目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/service/hadoop-2.7.7/data</value>
</property>
<!--配置HDFS网页登录使用的静态用户为root-->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
(2)修改hdfs-site.xml
在<configuration></configuration>间添加以下内容,保存后退出。
<!--nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop01:9001</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop03:9002</value>
</property>
<!--指定HDFS副本的数量-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--指定NN存放元数据信息的位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/opt/service/hadoop-2.7.7/hdfs/name</value>
</property>
<!--指定DN存放元数据信息的位置-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/opt/service/hadoop-2.7.7/hdfs/data</value>
</property>
(3)修改mapred-site.xml
该文件夹下没有mapred-site.xml这个文件,所以需要执行以下操作。
cp mapred-site.xml.template mapred-site.xml
然后在<configuration></configuration>间添加以下内容,保存后退出。
<!--指定MR运行在yarn上-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!--历史服务器端地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
</property>
<!--历史服务器web端地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value>
</property>
(4)编辑yarn-site.xml
在<configuration></configuration>间添加以下内容,保存后退出。
<!--指定MR走shuffle-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop02</value>
</property>
<!--yarn容器允许分配的最大最小内存-->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
<!--yarn容器允许管理的物理内存大小-->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
<!--关闭yarn对虚拟内存的限制检查-->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!--开启日志聚集功能-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!--设置日志聚集服务器地址-->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop01:19888/jobhistory/logs</value>
</property>
<!--设置日志保留时间为7天-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
(5)编辑hadoop_env.sh
改动这个地方即可。

(6)编辑slaves
把原有内容删除,添加三个容器的名字,如下。

注:不要有空格或者空行!
(7)配置环境变量
vi /etc/profile
在最后添加如下内容。
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
使环境变量生效。
source /etc/profile
5.分发hadoop到其余两个容器
scp -r /opt/service/hadoop-2.7.7 hadoop02:/opt/service
scp -r /opt/service/hadoop-2.7.7 hadoop03:/opt/service
6.分发配置文件
scp -r /etc/profile hadoop02:/etc/profile
scp -r /etc/profile hadoop03:/etc/profile
在hadoop02和hadoop03上分别执行以下命令,使环境变量生效。
source /etc/profile
7.启动集群
(1)格式化hdfs
在hadoop01上执行以下命令。
cd /opt/service/hadoop-2.7.7
bin/hdfs namenode -format
格式化成功,结束状态为0

(2)启动hdfs和yarn
start-dfs.sh
start-yarn.sh
注:在hadoop01上启动dfs,在hadoop02上启动yarn
(3)查看集群状态

使用jps查看各容器的进程,和上三图一致即为成功。
(4)在web端查看

搭建并启动成功,感谢浏览!如有问题,欢迎指正和讨论