本文目录

写在前面

配置前须知

  1. 请用root用户登录虚拟机,以保证有充分的操作权限
  2. 可以使用第三方终端来连接虚拟机,这样会让我们配置的效率更高
  3. 有良好的心态来应对可能出现的意料之外的问题,有问题可以留言或私信,博主将会第一时间回复
  4. 在中途配置的过程中,尽量不要重启虚拟机,以免配置失效,如果重启,可能需要重新配置/etc/下的文件
  5. 配置过程中的主机名等请自行修改为自己的个人所需信息

第三方终端可以使用Windows自带的cmd,也可以使用之前博主推荐过的Tabby,详见​​往期博客​

集群规划

一主两从

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器

step0 可能会遇到的问题及解决方式

CentOS7 启动Docker后进入tty命令行界面无法退出的解决方式 ​​链接​​​ CentOS7下Docker重启容器后防火墙因重置失效的解决方式 ​​链接​

step1 开启docker拉取镜像

Docker 镜像查看:

​docker images​

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_02

拉取镜像:

​docker pull registry.cn-beijing.aliyuncs.com/jing-studio/centos7-hadoop​​ 进行中:

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_03


结束:

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_04

step2 创建容器

DMaster315:

docker run -d --name DMaster315 -h DMaster315 \
-p 50070:50070 --privileged=true \
registry.cn-beijing.aliyuncs.com/jing-studio/centos7-hadoop /usr/sbin/init

Docker 上部署一主两从Hadoop集群 | [Centos7]_xml_05


DSlave01-315 && DSlave02-315:

docker run -d --name DSlave01-315 -h DSlave01-315 \
--privileged=true \
registry.cn-beijing.aliyuncs.com/jing-studio/centos7-hadoop /usr/sbin/init

docker run -d --name DSlave02-315 -h DSlave02-315 \
--privileged=true \
registry.cn-beijing.aliyuncs.com/jing-studio/centos7-hadoop /usr/sbin/init

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_06


​docker images​​查看:

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_07


如果说你是直接在虚拟机的终端中操作的命令,可能会遇见跳转到了命令行模式,而没有了图形化界面,可以参考博主的这篇博客

​CentOS7 启动Docker后进入tty命令行界面无法退出的解决方式​​:进入图形化界面

step3 免密登录配置

1. ip查看

如果此时你下载了第三方终端,建议开启三个标签页同时连接虚拟机,并使得三个标签页分别进入docker的三个机器:一个进入DMaster,一个进入DSlave01,另一个进入DSlave02
请先确认容器已经开启(​​​docker ps​​​查看所有已经开启的容器),如果未开启,请用命令​​docker ps -a​​​查看想要开启的容器的id,然后用命令​​docker start 容器id​​​来开启
命令:

进入DMaster315,并进入该机器的命令行终端
docker exec -it DMaster315 /bin/bash
进入DSlave01-315,并进入该机器的命令行终端
docker exec -it DSlave01-315 /bin/bash
进入DSlave02-315,并进入该机器的命令行终端
docker exec

进入容器查看IP:

命令是:​​ip addr​​ 172.17.0.2/16 DMaster315

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_08


172.17.0.3/16 DSlave01-315

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_09


172.17.0.4/16 DSlave02-315

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_10


整理一下:

172.17.0.2 DMaster315
172.17.0.3 DSlave01-315
172.17.0.4 DSlave02-315

2. 设置主机名

DMaster315

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_11


​vi /etc/sysconfig/network​​ 需要写入:

NETWORKING=yes
HOSTNAME=DMaster315

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_12


DSlave01-315

​vi /etc/sysconfig/network​

Docker 上部署一主两从Hadoop集群 | [Centos7]_xml_13

需要写入:

NETWORKING=yes
HOSTNAME=DSlave01-315

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_14

DSlave02-315:

​vi /etc/sysconfig/network​

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_15

需要写入:

NETWORKING=yes
HOSTNAME=DSlave02-315

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_16

3. 主机名与ip地址映射

在三个机器上操作
修改​​​/etc/hosts​​ 使得三个机器该文件都有以下三行:

172.17.0.2 DMaster315
172.17.0.3 DSlave01-315
172.17.0.4 DSlave02-315

DMaster315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_17


DSlave01-315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_18


DSlave02-315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_19


开启多个标签页分别进入三个机器配置效率真的的很高

4. 免密登录

安装​​passwd​​​​yum install passwd​

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_20


修改root密码,需要两次输入相同密码

DMaster315修改密码:

Docker 上部署一主两从Hadoop集群 | [Centos7]_xml_21

DSlave01-315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_22

DSlave02-315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_xml_23


查看各个机器​​~/.ssh​​下是否有密钥文件(​​id_rsa.pub​​文件)

如果没有需要自己生成,已经有的话,查看三个机器的密钥文件是否相同

  1. 如果相同的话,只需要在三个机器分别连接其他机器
  2. 如果不相同的话,参考本人​​博客​​​进行配置
    查看​​​authorized_keys​​​中是否包含有三个机器的​​id_rsa.pub​
  3. 如果有,便不用追加进入​​authorized_keys​
  4. 如果没有,需要将文件追加进入​​authorized_keys​​​ 如果和博主一样三个机器均已经含有​​id_rsa.pub​​文件,并且​​authorized_keys​​ 文件中已经含有三个机器的​​id_rsa.pub​​文件,可以不必进行任何修改

5. 免密登录效果

DMaster315 ssh 其他机器

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_24


DSlave01-315 ssh 其他机器:

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_25

DSlave02-315 ssh 其他机器:

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_26


免密登陆成功

***bug fix1.0 /etc/hosts修改完成后重启容器失效

在配置完/etc/hosts之后,由于一些原因就关闭了虚拟机,再次打开之后发现免密登录失效

查看之后得知,在每次重启之后,/etc/hosts就会重置,因为运行容器是以挂载的方式进行的,所以就会在下次登陆的时候失效:

Docker 上部署一主两从Hadoop集群 | [Centos7]_xml_27

可以参考​​博客​​​ 解决方式:
要在三个机器的​​/etc/hosts​​中都含有ip和主机名的映射

在三个机器的​​~/.bashrc​​​中分别添加:
为了方便复制:
是>>追加写,切勿少了一个大于号

# add 2 lines to fix the problem : restart container ,/etc/hosts reset
echo "172.17.0.3 DSlave01-315" >> /etc/hosts
echo "172.17.0.4 DSlave02-315" >> /etc/hosts
echo "172.17.0.2 DMaster315" >>

Dmaster315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_28


DSlave01-315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_29

DSlave02-315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_30

然后必须要​​source ~/.bashrc​​,必须在三个机器上均进行source操作

step4 关闭防火墙

命令行关闭

命令是​​systemctl stop iptables.service​​ 在三个机器都需要进行操作:

DMaster315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_31


DSlave01-315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_32

DSlave02-315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_33

*** bug fix2.0 重启容器后,防火墙再次重启,影响集群正常工作

step5 hadoop配置文件修改

在DMaster315操作:
​​​cd /usr/local/hadoop/etc/hadoop​

1. core-site.xml

​vim core-site<Tab>​配置文件中的主机名端口等根据自己实际情况修改,切勿盲目CV
property标签对要放在configuration标签对中

<configuration><property>
<name>fs.defaultFS</name>
<value>hdfs://DMaster315:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/data/hadoopdata</value>
</property>
</configuration>

Docker 上部署一主两从Hadoop集群 | [Centos7]_xml_34

创建目录
​​​mkdir -p /home/data​​​​mkdir -p /home/data/hadoopdata​

2. hdfs-site.xml

配置文件中的主机名端口等根据自己实际情况修改,切勿盲目CV
property标签对要放在configuration标签对中

<configuration>
<property><!--配置存储namenode数据的目录-->
<name>dfs.namenode.name.dir</name>
<value>/home/data/hadoopdata/name</value>
</property>
 <property><!--配置存储datanode数据的目录-->
<name>dfs.datanode.data.dir</name>
<value>/home/data/hadoopdata/data</value>
</property>
  <property><!--配置副本数量-->
<name>dfs.replication</name>
<value>1</value>
</property>  
  <property><!--配置第二名称节点,放到DMaster315 -->
     <name>dfs.secondary.http.address</name>
     <value>DMaster315:50090</value>
  </property>
</configuration>

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_35

3. mapred-site.xml:

配置文件中的主机名端口等根据自己实际情况修改,切勿盲目CV
property标签对要放在configuration标签对中
首先运行命令:
​​​cp mapred-site.xml.template mapred-site.xml ​​​ 然后​​vim mapred-site.xml ​

<configuration>
<property>
<name>mapreduce.Framework.name</name>
<value>yarn</value>
</property>
</configuration>

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_36

4. yarn-site.xml

配置文件中的主机名端口等根据自己实际情况修改,切勿盲目CV
property标签对要放在configuration标签对中

<configuration>
<property> <!--配置yarn主节点-->
<name>yarn.resourcemanager.hostname</name>
<value>DMaster315</value>
</property>
<property><!--配置执行的计算框架-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_37

5. slaves

配置文件中的主机名端口等根据自己实际情况修改,切勿盲目CV

property标签对要放在configuration标签对中

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_38

6. 测试互联互通

Dmaster ping dslave01-315 dslave02-315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_39


Dslave01-315 ping dmaster315 dslave02-315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_40


DSlave02-315 ping DMaster315 DSlave01-315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_41


可以互联互通,接下来传送文件

7. 传送到其他节点

切换到对应的目录:
​​​cd /usr/local/hadoop/etc/hadoop​​ 命令:

传送到DSlave01-315
scp slaves root@DSlave01-315:/usr/local/hadoop/etc/hadoop/
scp mapred-site.xml root@DSlave01-315:/usr/local/hadoop/etc/hadoop
scp yarn-site.xml root@DSlave01-315:/usr/local/hadoop/etc/hadoop/
scp hdfs-site.xml root@DSlave01-315:/usr/local/hadoop/etc/hadoop
scp core-site.xml root@DSlave01-315:/usr/local/hadoop/etc/hadoop
scp -r /home/data/hadoopdata root@DSlave01-315:/home/
传送到DSlave02-315
scp slaves root@DSlave02-315:/usr/local/hadoop/etc/hadoop/
scp mapred-site.xml root@DSlave02-315:/usr/local/hadoop/etc/hadoop
scp yarn-site.xml root@DSlave02-315:/usr/local/hadoop/etc/hadoop/
scp hdfs-site.xml root@DSlave02-315:/usr/local/hadoop/etc/hadoop
scp core-site.xml root@DSlave02-315:/usr/local/hadoop/etc/hadoop
scp

传送给DSlave01-315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_42


传送给DSlave02-315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_43

step6 格式化节点

在三台机器分别执行:

​hadoop namenode -format​​ DMaster315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_44


DMaster315格式化成功:

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_45

DSlave01-315 格式化成功:

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_46


DSlave02-315 格式化成功:

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_47

step7 开启集群查看状态

开启集群

经典命令(应该记住的):

​/usr/local/hadoop/sbin/start-all.sh​​ 现在切换到Dmaster315开启集群:

在中途输入了一个yes,应该是首次没有确认的原因

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_48


Jps信息查看:

DMaster315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_49

DSlave01-315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_50

DSlave02-315:

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_51


与预期设计一致~

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_52

查看运行状况

​hadoop dfsadmin -report​

Docker 上部署一主两从Hadoop集群 | [Centos7]_xml_53


Docker 上部署一主两从Hadoop集群 | [Centos7]_xml_54

datanode三个节点全有,配置齐全~

到DSlave01-315查看:

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_55


datanode三个节点全有,配置齐全~

到DSlave02-315查看:

Docker 上部署一主两从Hadoop集群 | [Centos7]_xml_56


datanode三个节点全有,配置齐全~

Web UI查看集群状态

进入虚拟机主机名的50070端口:

​master315:50070​

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_57


Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_58


三个节点都有,配置齐全~

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_59


Docker 上部署一主两从Hadoop集群 | [Centos7]_xml_60


到这里,Docker上配置Hadoop集群配置完成,下面运行WordCount测试一下

***bug fix2.0 重启容器后,防火墙再次重启,影响集群正常工作

在博主重启完虚拟机之后(意味着容器也重启了),这个时候当博主再次启动集群之后,发现​​live datanode​​​显示为1,当在两个DSlave01-315,DSlave02-315上进行操作的时候,发现从机无法与主机通过​​9000​​端口进行信息传输

错误如下:

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_61


发现Live datanodes为1不正常,到其他节点也出了问题:

Docker 上部署一主两从Hadoop集群 | [Centos7]_xml_62


Docker 上部署一主两从Hadoop集群 | [Centos7]_xml_63

原因是因为容器重启导致的之前防火墙设置的失效,所以我们要进行修改​​~/.bashrc​​,使得一旦开启容器,便将防火墙关闭,解决方式如下:

DMaster315、DSlave01-315、DSlave02-315中的​​~/.bashrc​​添加:

​vi ~/.bashrc​

systemctl stop iptables.service

step8 运行wordCount

在DMaster315 运行:

​hadoop fs -mkdir /input​​​​hadoop fs -ls /​

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_64


​cd /usr/local/hadoop​

​touch in.txt​

​vim in.txt​

写点东西进去

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_65


将​​in.txt​​文件添加到hdfs /input/下:

​hadoop fs -put in.txt /input/​

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_66


提交:注意切换到和博主同样的目录具体可见下图:

​cd share/hadoop/mapreduce​

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_67


提交命令:

hadoop jar hadoop-mapreduce-examples-2.7.6.jar \

提交之后:

Docker 上部署一主两从Hadoop集群 | [Centos7]_docker_68


查看结果:

Docker 上部署一主两从Hadoop集群 | [Centos7]_hadoop_69


状态显示成功

命令查看:

​hadoop fs -cat /output/part-r-00000​

Docker 上部署一主两从Hadoop集群 | [Centos7]_xml_70


结果正确!

关闭集群

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_71

如果有的地方不对,请及时联系/评论/私信博主进行修改

更文不易,麻烦点个赞

Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_72


Docker 上部署一主两从Hadoop集群 | [Centos7]_容器_73


分享下一篇文章:

阿里云镜像服务关联Github上传Docker容器制作的镜像 ​​链接​