本文最后更新于:2022年10月16日 下午
Docker操作
先学习一下基础的docker命令,后面常用,这里放出来备查
查看容器container
docker ps 的命令包括: 1)-a 列出所有容器 2)-l 列出最新创建容器
3)-n=2 列出最近创建的2个容器 4)-q 仅列出容器ID 5)-s 显示容器大小
删除容器
1
| sudo docker rm 1051267f9afb
|
查看镜像image
删除镜像
1
| sudo docker rmi 5d0da3dc9764
|
启动容器
1
| sudo docker run -itd weicg/hadoop:1.2
|
1
| sudo docker exec -it be349f8dd945 bash
|
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
|
开启多个容器
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
编辑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 2 3
| docker exec -it hadoop1 bash docker exec -it hadoop2 bash docker exec -it hadoop3 bash
|
将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 1649 NameNode 1854 SecondaryNameNode 1967 Jps
|
hadoop2和hadoop3上启动了数据节点:
1 2 3
| root@004916b254fc:/opt/hadoop-3.1.3/etc/hadoop 294 DataNode 361 Jps
|
1 2 3
| root@c5bea89663f9:/ 279 Jps 188 DataNode
|
第二步在主节点上启动yarn管理系统:start-yarn.sh
Hadoop1:
1 2 3 4 5
| root@5d574541fd94:/opt/hadoop-3.1.3/etc/hadoop 3751 Jps 3255 SecondaryNameNode 3049 NameNode 3455 ResourceManager
|
Hadoop2和hadoop3:
1 2 3 4
| root@004916b254fc:/opt/hadoop-3.1.3/etc/hadoop 851 NodeManager 731 DataNode 975 Jps
|
1 2 3 4
| root@c5bea89663f9:/ 644 DataNode 890 Jps 766 NodeManager
|
可以看到两台从节点都多了一个NodeManager
此时hadoop应用已经成功运行。
启动应用不推荐使用start-all
停止应用:stop-dfs.sh
和stop-yarn.sh
或者stop-all.sh
在hadoop运行中有哪个datanode掉了很正常🤣🤣
使用下面命令在数据节点上重开⬇️
hdfs --daemon start datanode
在宿主机上可以通过IP:8088查看Hadoop运行状态。