Docker部署Hadoop-04-把Hadoop容器导出导入并使用

参考

Docker部署Hadoop-01-Docker安装
Docker部署Hadoop-02-Docker常见操作
Docker部署Hadoop-03-Docker部署Hadoop

已配置Hadoop三容器(master/worker01/worker02)打包传输&同事复现完整教程

本教程基于已配置完成、可正常运行WordCount 的Hadoop三容器环境,从重启容器验证 开始,到打包镜像、传输文件、同事导入复现全流程,步骤无冗余,可直接按命令执行,确保同事能1:1复现你的Hadoop集群环境。

前提说明

  1. 你的环境:Ubuntu宿主机、已创建hadoop-net网络、三个容器(master/worker01/worker02)已配置好Hadoop+SSH免密+WordCount可运行;
  2. 核心逻辑:容器无法直接传输,将每个运行正常的容器打包为独立镜像(保留所有配置/环境),同事导入镜像后,用相同命令重建容器即可;
  3. 传输文件:仅需传输3个镜像压缩包+1个一键启动脚本,同事无需再做任何配置。

第一部分:你的操作------重启容器验证+打包镜像+制作启动脚本

步骤1:重启Hadoop三容器并验证运行状态

确保容器重启后仍能正常运行,避免打包"有问题的容器"

bash 复制代码
# 1. 启动所有容器(按master→worker01→worker02顺序)
docker start master worker01 worker02

# 2. 验证容器是否正常启动(STATUS列显示Up即为正常)
docker ps | grep -E "master|worker01|worker02"

# 3. 进入master容器,验证Hadoop集群是否正常(可选,确保万无一失)
docker exec -it master bash
# 验证jps进程(master应有NameNode/SecondaryNameNode/ResourceManager)
jps
# 验证Worker节点通信(免密登录worker01,无密码提示即为正常)
ssh worker01 hostname
# 验证WordCount(可选,快速跑一遍)
hdfs dfs -rm -r /user/root/output
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount \
-Dmapreduce.application.classpath=$(hadoop classpath) \
-Dyarn.app.mapreduce.am.env="HADOOP_MAPRED_HOME=/usr/local/hadoop" \
-Dmapreduce.map.env="HADOOP_MAPRED_HOME=/usr/local/hadoop" \
-Dmapreduce.reduce.env="HADOOP_MAPRED_HOME=/usr/local/hadoop" \
/user/root/input /user/root/output 

hdfs dfs -cat /user/root/output/part-r-00000
# 验证完成后退出master容器
exit

步骤2:将运行正常的容器打包为独立镜像

为每个容器创建专属镜像(标签统一为v1,便于识别),打包前无需停止容器,Docker会自动快照当前状态。

bash 复制代码
# 1. 打包master容器为镜像:hadoop-master:v1
docker commit -m "已配置Hadoop master节点,含SSH免密+Hadoop集群配置+WordCount可运行" master hadoop-master:v1

# 2. 打包worker01容器为镜像:hadoop-worker01:v1
docker commit -m "已配置Hadoop worker01节点,同步master配置+SSH免密" worker01 hadoop-worker01:v1

# 3. 打包worker02容器为镜像:hadoop-worker02:v1
docker commit -m "已配置Hadoop worker02节点,同步master配置+SSH免密" worker02 hadoop-worker02:v1

# 4. 验证镜像创建成功(应看到3个新镜像)
docker images | grep -E "hadoop-master|hadoop-worker01|hadoop-worker02"

步骤3:将镜像导出为压缩文件(便于传输)

镜像导出为.tar格式,体积约2-3GB/个,可直接通过网盘、U盘、SCP传输,建议保留原文件名,避免同事混淆

bash 复制代码
# 1. 导出master镜像
docker save hadoop-master:v1 > hadoop-master-v1.tar

# 2. 导出worker01镜像
docker save hadoop-worker01:v1 > hadoop-worker01-v1.tar

# 3. 导出worker02镜像
docker save hadoop-worker02:v1 > hadoop-worker02-v1.tar

# (可选)压缩镜像(减小体积,需同事解压后再导入,推荐)
gzip hadoop-master-v1.tar
gzip hadoop-worker01-v1.tar
gzip hadoop-worker02-v1.tar
# 压缩后文件名为:hadoop-master-v1.tar.gz、hadoop-worker01-v1.tar.gz、hadoop-worker02-v1.tar.gz

也可以多线程压缩tar为tar.gz

bash 复制代码
sudo apt update && sudo apt install pigz -y
# 压缩 master 镜像(4 线程+保留源文件+进度)
pigz -v -p 4 -k hadoop-master-v1.tar

# 压缩 worker01/worker02 镜像
pigz -v -p 4 -k hadoop-worker01-v1.tar
pigz -v -p 4 -k hadoop-worker02-v1.tar

把导出的镜像放在hadoop-docker目录下

bash 复制代码
mkdir -p ~/hadoop-docker
mv hadoop-master-v1.tar.gz ~/hadoop-docker/
mv hadoop-worker01-v1.tar.gz ~/hadoop-docker/
mv hadoop-worker02-v1.tar.gz ~/hadoop-docker/

步骤4:制作一键启动脚本(关键!同事无需写复杂命令)

在宿主机的hadoop-docker目录下创建start-hadoop-cluster.sh脚本,脚本中包含创建网络+启动所有容器的完整命令,与你最初启动容器的参数完全一致(IP/端口/网络/主机名)。

bash 复制代码
# 进入你的hadoop-docker目录(镜像导出文件也在该目录,便于统一传输)
cd ~/hadoop-docker
# 创建并编辑一键启动脚本
sudo nano start-hadoop-cluster.sh

将以下内容复制到脚本中(无需修改任何参数,与你的环境完全一致):

bash 复制代码
#!/bin/bash
# 作者:你的名字
# 功能:一键启动Hadoop三节点集群(master/worker01/worker02)
# 说明:运行前确保已导入3个Hadoop镜像,且无同名容器/网络

# 1. 创建Hadoop专用网络(若已存在则跳过,避免报错)
docker network create --driver bridge --subnet=172.19.0.0/16 hadoop-net 2>/dev/null || echo "hadoop-net网络已存在,跳过创建"

# 2. 启动master节点(映射9870/8088/9000端口,与原环境一致)
docker run -itd \
  --name master \
  --hostname master \
  --net hadoop-net \
  --ip 172.19.0.2 \
  -p 9870:9870 \
  -p 8088:8088 \
  -p 9000:9000 \
  --privileged \
  hadoop-master:v1

# 3. 启动worker01节点
docker run -itd \
  --name worker01 \
  --hostname worker01 \
  --net hadoop-net \
  --ip 172.19.0.3 \
  --privileged \
  hadoop-worker01:v1

# 4. 启动worker02节点
docker run -itd \
  --name worker02 \
  --hostname worker02 \
  --net hadoop-net \
  --ip 172.19.0.4 \
  --privileged \
  hadoop-worker02:v1

# 5. 验证启动结果
echo -e "\n===== Hadoop集群容器启动结果 ====="
docker ps | grep -E "master|worker01|worker02"
echo -e "\n===== 访问地址 ====="
echo "HDFS WebUI: http://宿主机IP:9870"
echo "YARN WebUI: http://宿主机IP:8088"
echo -e "\n===== 验证集群命令 ====="
echo "1. 进入master容器:docker exec -it master bash"
echo "2. 验证Worker通信:ssh worker01 hostname"
echo "3. 验证WordCount:hadoop jar \$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount -Dmapreduce.application.classpath=$(hadoop classpath) -Dyarn.app.mapreduce.am.env="HADOOP_MAPRED_HOME=/usr/local/hadoop" -Dmapreduce.map.env="HADOOP_MAPRED_HOME=/usr/local/hadoop" -Dmapreduce.reduce.env="HADOOP_MAPRED_HOME=/usr/local/hadoop"  /user/root/input /user/root/output1"

给脚本添加执行权限

bash 复制代码
chmod +x start-hadoop-cluster.sh

步骤5:整理传输文件(共4个,统一放在hadoop-docker目录)

此时你的~/hadoop-docker目录下应有以下4个文件,一次性传给同事即可

复制代码
~/hadoop-docker/
├── hadoop-master-v1.tar.gz(或hadoop-master-v1.tar)
├── hadoop-worker01-v1.tar.gz(或hadoop-worker01-v1.tar)
├── hadoop-worker02-v1.tar.gz(或hadoop-worker02-v1.tar)
└── start-hadoop-cluster.sh(一键启动脚本)

传输方式

  • 本地传输:U盘/移动硬盘直接复制;

  • 远程传输:SCP传给同事服务器(示例命令);

    bash 复制代码
    scp ~/hadoop-docker/* 同事用户名@同事服务器IP:/home/同事用户名/hadoop-docker/
  • 网盘传输:上传至百度网盘/阿里云盘,分享链接给同事。

第二部分:同事的操作------接收文件+导入镜像+一键启动集群

同事仅需执行3步操作 ,无需配置任何环境,即可复现你的Hadoop集群,全程无需手动写Docker命令

前提

同事的机器需安装Docker(若未安装,先执行以下命令快速安装):

bash 复制代码
# 同事端Docker快速安装(Ubuntu系统)
sudo apt update && sudo apt install docker.io -y
sudo systemctl start docker && sudo systemctl enable docker
# 验证Docker安装
docker --version

步骤1:接收文件并整理目录

将你传输的4个文件统一放在同一目录 下(如~/hadoop-docker),方便操作:

bash 复制代码
# 同事端创建目录
mkdir -p ~/hadoop-docker && cd ~/hadoop-docker
# 将传输的4个文件复制到该目录
# 若为压缩包(.tar.gz),先解压(若为未压缩的.tar,跳过此步)
gzip -d hadoop-master-v1.tar.gz
gzip -d hadoop-worker01-v1.tar.gz
gzip -d hadoop-worker02-v1.tar.gz
# 解压后得到.tar格式的镜像文件

也可以采用多线程解压

bash 复制代码
sudo apt update && sudo apt install pigz -y

# 解压master镜像包
pigz -d -k -v hadoop-master-v1.tar.gz
# 解压worker01镜像包
pigz -d -k -v hadoop-worker01-v1.tar.gz
# 解压worker02镜像包
pigz -d -k -v hadoop-worker02-v1.tar.gz

步骤2:导入Hadoop镜像(关键!按顺序导入)

使用docker load命令导入镜像,导入完成后可验证镜像是否存在

bash 复制代码
# 同事端在hadoop-docker目录下执行
# 1. 导入master镜像
docker load < hadoop-master-v1.tar

# 2. 导入worker01镜像
docker load < hadoop-worker01-v1.tar

# 3. 导入worker02镜像
docker load < hadoop-worker02-v1.tar

# 4. 验证镜像导入成功(应看到3个镜像,与你这边一致)
docker images | grep -E "hadoop-master|hadoop-worker01|hadoop-worker02"

步骤3:一键启动Hadoop集群

直接执行你提供的启动脚本,无需修改任何参数,脚本会自动创建网络+启动所有容器:

bash 复制代码
# 同事端在hadoop-docker目录下执行
# 给脚本添加执行权限(若未添加)
sudo chmod +x start-hadoop-cluster.sh
# 一键启动集群
./start-hadoop-cluster.sh

脚本执行成功标志 :最后会输出3个容器的状态,STATUS列均为Up

步骤4:同事端验证集群是否正常运行(与你这边的验证方式一致)

bash 复制代码
# 1. 进入master容器
docker exec -it master bash

# 2. 验证master节点Hadoop进程(核心!应有以下4个进程)
jps
# 正常输出:
# XXXX NameNode
# XXXX SecondaryNameNode
# XXXX ResourceManager
# XXXX Jps

# 3. 验证SSH免密登录Worker节点(无密码提示,直接返回主机名)
ssh worker01 hostname  # 输出:worker01
ssh worker02 hostname  # 输出:worker02

# 4. 验证WordCount(直接运行,无需重新配置)
hdfs dfs -cat /user/root/output/part-r-00000
# 正常输出单词统计结果:
# Hadoop  1
# Hello   1
# World   1

# 5. 验证WebUI访问(同事在本地浏览器打开)
# HDFS WebUI:http://同事宿主机IP:9870
# YARN WebUI:http://同事宿主机IP:8088
bash 复制代码
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount -Dmapreduce.application.classpath=$(hadoop classpath) -Dyarn.app.mapreduce.am.env="HADOOP_MAPRED_HOME=/usr/local/hadoop" -Dmapreduce.map.env="HADOOP_MAPRED_HOME=/usr/local/hadoop" -Dmapreduce.reduce.env="HADOOP_MAPRED_HOME=/usr/local/hadoop"  /user/root/input /user/root/output1

第三部分:常见问题排查(你和同事均可参考)

问题1:同事端执行脚本提示"权限不足"

解决:给脚本添加执行权限,或用sudo运行:

bash 复制代码
chmod +x start-hadoop-cluster.sh
# 或
sudo ./start-hadoop-cluster.sh

问题2:同事端启动容器提示"IP已被占用/容器名已存在"

解决:删除同名容器/网络,重新执行脚本:

bash 复制代码
# 删除同名容器
docker stop master worker01 worker02 && docker rm master worker01 worker02
# 删除同名网络
docker network rm hadoop-net
# 重新执行启动脚本
./start-hadoop-cluster.sh

问题3:同事端SSH免密登录失败

解决:大概率是容器打包时快照异常,重新在master容器内执行免密配置(仅需1次):

bash 复制代码
# 同事端进入master容器
docker exec -it master bash
# 重新复制公钥到所有节点
ssh-copy-id master
ssh-copy-id worker01
ssh-copy-id worker02
# 验证
ssh worker01 hostname

问题4:镜像导出/导入过慢

解决:

  1. 打包前停止容器(减少镜像体积):docker stop master worker01 worker02
  2. gzip压缩后再传输(体积减少约50%);
  3. 远程传输优先使用SCP/FRP,避免网盘限速。

第四部分:额外优化(可选,适合频繁传输)

  1. 合并为基础镜像 :若三个节点配置高度一致,可仅打包master为基础镜像,同事用该镜像启动worker节点(节省传输体积);
  2. 添加数据持久化 :若需要保留HDFS数据,可在启动脚本中添加命名卷挂载(参考之前的持久化配置);
  3. 制作Docker Compose文件 :替代shell启动脚本,同事仅需docker-compose up -d即可启动,更符合Docker规范。

总结

  1. 你的核心操作:重启验证→容器commit为镜像→save为tar→制作一键启动脚本→传输4个文件
  2. 同事的核心操作:接收文件→load导入镜像→执行启动脚本→验证运行
  3. 核心优势:同事无需再做任何Hadoop/SSH配置,全程执行现成命令,10分钟内即可复现可运行的Hadoop集群;
  4. 关键保障:打包的是运行正常的容器快照,保留了所有配置、环境变量、SSH免密和Hadoop集群状态,实现1:1复现。
相关推荐
JTCC2 小时前
Java 设计模式西游篇 - 第一回:单例模式显神通 悟空巧解资源劫
java·单例模式·设计模式
ren049182 小时前
多线程、单例模式
java
cyw89982 小时前
docker 安装 ollama 并运行
运维·docker·容器
进击切图仔2 小时前
docker compose 的简单使用
运维·docker·容器
Nuopiane2 小时前
MyPal3(7)
java·开发语言
不光头强2 小时前
object所有方法及知识点
java·开发语言·jvm
予枫的编程笔记2 小时前
【面试专栏|JVM虚拟机】CMS vs 其他垃圾收集器:核心差异+适用场景
java·jvm·java面试·后端开发·垃圾回收机制·cmv垃圾回收器·jvm性能优化
渡过晚枫2 小时前
[第十六届蓝桥杯/java/算法]1.偏蓝
java·算法·蓝桥杯
灰阳阳2 小时前
Docker-网络类型详解
网络·docker·容器
zhaoyin19942 小时前
JavaScript面试题笔记
java·javascript·笔记