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
2
ls /usr/local
/usr/local/hadoop-2.7.3/bin/hadoop version

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
</configuration>

将宿主机 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>

将宿主机 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?xml version="1.0"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:18040</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:18030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:18025</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:18141</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:18088</value>
</property>
</configuration>

将宿主机 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

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

将宿主机 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
2
slave01
slave02

2.8 配置Hadoop环境变量

1
vim ~/.bashrc

TODO: ~/.bashrc~/.bash_profile 的区别?试了下 Docker 中 Ubuntu 无 ~/.bash_profile文件

在 .bashrc 末尾添加以下内容

1
2
3
4
5
6
7
8
9
10
# set hadoop_home
export HADOOP_HOME=/usr/local/hadoop-2.7.3
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_ROOT_LOGGER=INFO,console
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"

使环境变量立即生效

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
2
3
4
5
6
7
8
9
127.0.0.1       localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 master
172.17.0.3 slave01
172.17.0.4 slave02

PS: /etc/hosts 会在每次重启容器都会重置,所以每次都需要重新设置

参考: Docker容器修改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
2
3
/usr/local/hadoop-2.7.3/bin/hdfs namenode -format

hdfs namenode -format

出现上图 ·status 0 说明 成功

3.3 启动Hadoop集群(在master上执行)

1
2
3
/usr/local/hadoop-2.7.3/sbin/start-all.sh

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
2
3
4
5
6
7
8
9
CSharp
PHP C++
CPP
Baidu
Youku Baidu
Douban Hahaha
C++, CSharp
C#, PHP, PHP
Go

在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.修改配置文件 (比较麻烦,容易出现意外,不推荐)

  1. 删除容器,重新 run -p(推荐)

补充

1
2
# 查看 Hadoop Shell API 帮助
hadoop fs

参考

感谢帮助!