Windows Docker 安装部署 Hadoop(二)
本节 安装部署 Hadoop 集群
1. Hadoop 安装
1.1 创建并启动 安装好 jdk 的镜像,容器命名为 ubuntu-jdkinstalled
1 | docker run -it --name ubuntu-jdkinstalled ubuntu/jdkinstalled |

再次启动只需
docker start -i ubuntu-jdkinstalled
1.2 将/home
目录下 Hadoop压缩包 解压到 /usr/local
目录下
1 | tar -zxvf /home/hadoop-2.7.3.tar.gz -C /usr/local |

1.3 测试是否成功
1 | ls /usr/local |

2. 编辑 Hadoop 配置文件以及环境变量
2.1 配置 hadoop-env.sh
文件
2.2.1 使用 vim
修改 hadoop-env.sh
文件
1 | vim /usr/local/hadoop-2.7.3/etc/hadoop/hadoop-env.sh |
2.2.2 修改 JAVA_HOME
环境变量
1 | export JAVA_HOME=/usr/java/jdk1.8.0_131/ |

2.2 配置 yarn-env.sh
文件
2.2.1 使用 vim
修改 yarn-env.sh
文件
1 | vim /usr/local/hadoop-2.7.3/etc/hadoop/yarn-env.sh |
2.2.2 修改 JAVA_HOME
环境变量
1 | export JAVA_HOME=/usr/java/jdk1.8.0_131/ |

2.3 配置 core-site.xml
文件
方式1: 使用 vim
修改 core-site.xml
文件
1 | vim /usr/local/hadoop-2.7.3/etc/hadoop/core-site.xml |
方式2: 将下面的内容 保存为 core-site.xml
,再复制到容器中替换原文件
注意:
/usr/local/hadoop/tmp
路径Windows: F:-site.xml
1 |
|
将宿主机 core-site.xml 复制到 容器中
1 | docker cp F:/Temp/core-site.xml ubuntu-jdkinstalled:/home/ |
复制替换原文件
1 | cp /home/core-site.xml /usr/local/hadoop-2.7.3/etc/hadoop/core-site.xml |

2.4 配置 hdfs-site.xml
文件
将下面的内容 保存为 hdfs-site.xml
,再复制到容器中替换原文件
Windows: F:-site.xml
1 |
|
将宿主机 core-site.xml 复制到 容器中
1 | docker cp F:/Temp/hdfs-site.xml ubuntu-jdkinstalled:/home/ |
复制替换原文件
1 | cp /home/hdfs-site.xml /usr/local/hadoop-2.7.3/etc/hadoop/hdfs-site.xml |

2.5 配置 yarn-site.xml
文件
将下面的内容 保存为 yarn-site.xml
,再复制到容器中替换原文件
Windows: F:-site.xml
1 |
|
将宿主机 yarn-site.xml 复制到 容器中
1 | docker cp F:/Temp/yarn-site.xml ubuntu-jdkinstalled:/home/ |
复制替换原文件
1 | cp /home/yarn-site.xml /usr/local/hadoop-2.7.3/etc/hadoop/yarn-site.xml |

2.6 配置 mapred-site.xml
文件
PS: 原本不存在
mapred-site.xml
文件,只提供了模板文件
/usr/local/hadoop-2.7.3/etc/hadoop/mapred-site.xml.template
将下面的内容 保存为 mapred-site.xml
,再复制到容器中替换原文件
Windows: F:-site.xml
1 |
|
将宿主机 mapred-site.xml 复制到 容器中
1 | docker cp F:/Temp/mapred-site.xml ubuntu-jdkinstalled:/home/ |
复制替换原文件
1 | cp /home/mapred-site.xml /usr/local/hadoop-2.7.3/etc/hadoop/mapred-site.xml |

2.7 配置slaves文件
2.7.1 使用 vim
编辑 slaves
文件
1 | vim /usr/local/hadoop-2.7.3/etc/hadoop/slaves |
2.7.2 将 slaves
中内容用下方内容 替换
1 | slave01 |
2.8 配置Hadoop环境变量
1 | vim ~/.bashrc |
TODO:
~/.bashrc
与~/.bash_profile
的区别?试了下 Docker 中 Ubuntu 无~/.bash_profile
文件
在 .bashrc 末尾添加以下内容
1 | # set hadoop_home |

使环境变量立即生效
1 | source ~/.bashrc |
2.9 保存容器到镜像
到此,大部分配置工作已完成,现在保存到镜像
先退出容器,再保存到镜像
1 | exit |
1 | docker commit ubuntu-jdkinstalled ubuntu/hadoopinstalled |
使用
docker images
查看保存的镜像

3. 配置 Hadoop 集群
将创建3个节点:
- master
- slave01
- slave02
3.1 配置节点网络/连接方式
方式1:传统 ip
docker container 每次重启 ip 地址都不同,所以每次启动都需要修改 ip地址,比较麻烦
笔者测试:重启已经存在的容器,ip并不会改变,但重新从镜像中创建容器应该就会改变了
首先创建并启动 3节点 容器
新建 3 终端窗口,分别执行
1 | docker run -it -h master --name master -p 50070:50070 -p 18088:18088 ubuntu/hadoopinstalled |
1 | docker run -it -h slave01 --name slave01 ubuntu/hadoopinstalled |
1 | docker run -it -h slave02 --name slave02 ubuntu/hadoopinstalled |

补充:
再次启动,只需
1
2
3 docker start -i master
docker start -i slave01
docker start -i slave02
查看容器ip地址
在容器内部执行,
172.17.0.2 即为 master 的ip地址
笔者这里:
172.17.0.2 master
172.17.0.3 slave01
172.17.0.4 slave02
1 | cat /etc/hosts |

补充:在容器外部可通过下方获取所在容器名称及ip:
1 docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)![]()
编辑主机名映射
在 3个节点 内都要执行
1 | vim /etc/hosts |
三个节点都要执行此操作
添加上另外两个 主机名及 ip,例如 master 需要添加 slave01、slave02 的主机名映射
172.17.0.3 slave01 172.17.0.4 slave02
当然可以直接复制下方,覆盖掉就内容
1 | 127.0.0.1 localhost |

PS:
/etc/hosts
会在每次重启容器都会重置,所以每次都需要重新设置
开启 ssh服务(3节点都要开启)
3个终端窗口 都要执行
1 | /etc/init.d/ssh start |

PS: 每次重启容器,都需要重新执行
测试连接
在 master 上执行
1 | ssh slave01 |
中间 输入 yes 即可,如下图,成功连接 slave01,
按此方法
exit
(退出slave01) 后,再连接slave02

到此 3节点 成功建立链接
补充:如果需要使用 ifconfig、ping,需安装下方
1
2
3 apt-get update
apt install net-tools # 安装 ifconfig
apt install iputils-ping # 安装ping
方式2:同一 bridge network(适用于在docker中测试)
TODO:
3.2 格式化Hadoop文件目录(在master上执行)
3 节点 成功启动,并能连接成功后
只需要格式化一次,以后不需要
1 | /usr/local/hadoop-2.7.3/bin/hdfs namenode -format |


出现上图 ·
status 0
说明 成功
3.3 启动Hadoop集群(在master上执行)
1 | /usr/local/hadoop-2.7.3/sbin/start-all.sh |
中途输入
yes
即可

3.4 查看进程是否启动
在 master的终端 执行jps命令
1 | jps |

在 slave01的终端 执行jps命令

在 slave02 的终端 执行jps命令

3.5 Web UI查看集群是否成功启动
注意:不同版本的 hadoop 可能需要 映射的端口不同,所以前面映射端口时需注意
宿主机浏览器 打开 http://localhost:50070/,检查namenode 和datanode 是否正常


宿主机浏览器 打开 http://localhost:18088/,检查Yarn是否正常


3.6 运行PI实例检查集群是否成功
master 中 执行下方命令
1 | hadoop jar /usr/local/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar pi 10 10 |
最后输出:Estimated value of Pi is 3.20000000000000000000,即代表成功,笔者不知道为何,一直卡住了


TODO: hadoop 计算 PI 卡住
3.7 运行 wordcount 检查集群是否成功
以下皆在 master 上操作
新建 /home/wcinput
目录
1 | mkdir /home/wcinput |
新建文件
1 | touch /home/wcinput/wc.input |
添加文件内容
1 | vim /home/wcinput/wc.input |
1 | CSharp |
在hadoop上新建目录 /wcinput
1 | hadoop fs -mkdir /wcinput |
上传用于 计数的文件 到 hadoop
1 | hadoop fs -put /home/wcinput/wc.input /wcinput/wc.input |

查看是否上传成功
1 | hadoop fs -ls /wcinput |

master 中 执行下方命令
1 | hadoop jar /usr/local/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /wcinput /wcoutput |

查看结果
1 | hadoop fs -cat /wcoutput/* |

PS:发现居然 PHP 和 PHP, 居然分开计数了
Q&A
Q: docker run 时不小心错映射端口,如何修改端口映射?
A: 1.修改配置文件 (比较麻烦,容易出现意外,不推荐)
- 删除容器,重新 run -p(推荐)
补充
1 | # 查看 Hadoop Shell API 帮助 |
参考
感谢帮助!