Ubuntu上基于docker搭建Hadoop集群

本文最后更新于:2022年10月16日 下午

Docker操作

先学习一下基础的docker命令,后面常用,这里放出来备查

查看容器container

docker ps 的命令包括: 1)-a 列出所有容器 2)-l 列出最新创建容器 3)-n=2 列出最近创建的2个容器 4)-q 仅列出容器ID 5)-s 显示容器大小

1
sudo docker ps -a

删除容器

1
sudo docker rm 1051267f9afb

查看镜像image

1
sudo docker images

删除镜像

1
sudo docker rmi 5d0da3dc9764

启动容器

1
sudo docker run -itd weicg/hadoop:1.2
  • -d表示在后台运行,需要进入容器
1
sudo docker exec -it be349f8dd945 bash
  • 使用exec 进入容器时exit命令不会结束容器

Hadoop集群搭建

准备镜像

我选择的是dockerhub上的weicg/hadoop:1.2,同样是一位初学者制作的,试用还算可以(单机可以开箱即用)不过这里搭建集群还需要修改一些内容。来源:https://hub.docker.com/r/weicg/hadoop

1
sudo docker pull weicg/hadoop:1.2

我们打算建立一个一主两从的集群,需要开三个容器

建立网桥

1
sudo docker network create --driver bridge hadoop-br

开启多个容器

1
2
3
sudo docker run -itd --network hadoop-br --name hadoop1 -p 50070:50070 -p 8088:8088 weicg/hadoop:1.2
sudo docker run -itd --network hadoop-br --name hadoop2 weicg/hadoop:1.2
sudo docker run -itd --network hadoop-br --name hadoop3 weicg/hadoop:1.2

得到三个容器

  • 23c1187f8492
  • 676e08f5ecc5
  • d2ec810e1e89

进入这些容器只需要

1
2
3
sudo docker exec -it hadoop1 bash
sudo docker exec -it hadoop2 bash
sudo docker exec -it hadoop3 bash

查看网桥配置

1
sudo docker network inspect hadoop-br 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
"Containers": {
"23c1187f84929b19883f3ff3452688fca46c101e43bdfcc2a0cabaa4cd4fc593": {
"Name": "hadoop1",
"EndpointID": "27504f3d67c0a1e884ab8420c717b7bf5f3aa7db211360fa19a0d501fa6f9ed7",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
},
"676e08f5ecc5273542efd51e554ef1fa8790b2aa4a57fa3516cb39d6b09cfb7f": {
"Name": "hadoop2",
"EndpointID": "b766f1d85e339558f0bbf89e52e8e9a103c8d8e5b593dbcb6832367a925dcb4f",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
},
"d2ec810e1e897f47add8b09f8a813b6c23ab892fddd0706b88373d7f67f76b2f": {
"Name": "hadoop3",
"EndpointID": "552975d97feddc22fcf5d4ac1afa61be698846f08727e249d7581aaa33e220c2",
"MacAddress": "02:42:ac:12:00:04",
"IPv4Address": "172.18.0.4/16",
"IPv6Address": ""
}

可以看到三个docker的ip地址

172.18.0.2 hadoop1

172.18.0.3 hadoop2

172.18.0.4 hadoop3

使用ping命令分别检查是否网络通畅

以下命令需要分别进入三个容器内执行

1.更改hosts文件vim /etc/hosts,加入如下配置

1
2
3
172.18.0.2 hadoop1 
172.18.0.3 hadoop2
172.18.0.4 hadoop3

2.分别在三个容器内配置ssh,因为镜像已经生成了密钥,此处将本机密钥加入本机的访问列表中。

1
2
cd ~/.ssh
cat id_rsa.pub >> authorized_keys

完成后可以ssh root@hadoop2查看是否成功配置ssh和网络。

配置hadoop文件

进入hadoop1,创建一些配置用到的文件夹

1
2
mkdir /home/hadoop
mkdir /home/hadoop/tmp /home/hadoop/hdfs_name /home/hadoop/hdfs_data

切到hadoop配置目录

1
cd $HADOOP_HOME/etc/hadoop/

下面的编辑部分可以直接拷贝覆盖粘贴

编辑workers文件

vim workers

1
2
hadoop2
hadoop3

编辑core-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131702</value>
</property>
</configuration>

编辑hdfs-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/hdfs_name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/hdfs_data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop1:9001</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>

编辑mapred-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop1:19888</value>
</property>
</configuration>

编辑yarn-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
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoop1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoop1:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>hadoop1:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hadoop1:8088</value>
</property>
</configuration>

把上面配置好的文件拷贝到2、3号机

1
2
3
4
scp -r /home/hadoop hadoop2:/home/
scp -r /home/hadoop hadoop3:/home/
scp -r $HADOOP_HOME/etc/hadoop/ hadoop2:$HADOOP_HOME/etc/hadoop/
scp -r $HADOOP_HOME/etc/hadoop/ hadoop3:$HADOOP_HOME/etc/hadoop/

(可选)增加sbin目录的环境变量,方便随意启动

  1. 分别连接三台机器

    1
    2
    3
    docker exec -it hadoop1 bash
    docker exec -it hadoop2 bash
    docker exec -it hadoop3 bash
  2. 将hadoop/sbin目录加入PATH环境变量中vim ~/.bashrc

    追加内容export PATH=$PATH:$HADOOP_HOME/sbin

    然后执行source ~/.bashrc

这一步略过的话,启动hadoop的相关命令需要先cd $HADOOP_HOME/sbin

启动HADOOP

进入hadoop1号主节点

第一次启动需要格式化hdfs,后续绝对不要再执行这一条hdfs namenode -format

先在主节点上启动文件系统:start-dfs.sh

使用jps命令此时可以观察到:

hadoop1上启动了名称节点第二名称节点(第二名称节点可以配置在其他节点上)

1
2
3
4
root@5d574541fd94:/opt/hadoop-3.1.3/etc/hadoop# jps
1649 NameNode
1854 SecondaryNameNode
1967 Jps

hadoop2和hadoop3上启动了数据节点

1
2
3
root@004916b254fc:/opt/hadoop-3.1.3/etc/hadoop# jps
294 DataNode
361 Jps
1
2
3
root@c5bea89663f9:/# jps
279 Jps
188 DataNode

第二步在主节点上启动yarn管理系统:start-yarn.sh

Hadoop1:

1
2
3
4
5
root@5d574541fd94:/opt/hadoop-3.1.3/etc/hadoop# jps
3751 Jps
3255 SecondaryNameNode
3049 NameNode
3455 ResourceManager

Hadoop2和hadoop3:

1
2
3
4
root@004916b254fc:/opt/hadoop-3.1.3/etc/hadoop# jps
851 NodeManager
731 DataNode
975 Jps
1
2
3
4
root@c5bea89663f9:/# jps
644 DataNode
890 Jps
766 NodeManager

可以看到两台从节点都多了一个NodeManager

此时hadoop应用已经成功运行。

启动应用不推荐使用start-all

停止应用:stop-dfs.shstop-yarn.sh或者stop-all.sh

在hadoop运行中有哪个datanode掉了很正常🤣🤣

使用下面命令在数据节点上重开⬇️

hdfs --daemon start datanode

在宿主机上可以通过IP:8088查看Hadoop运行状态。


Ubuntu上基于docker搭建Hadoop集群
https://ash-one.github.io/2022/10/07/ubuntu-shang-de-ji-yu-docker-da-jian-hadoop-ji-qun/
作者
灰一
发布于
2022年10月7日
许可协议