Hadoop 3.3.6 完全分布式集群部署知识库
适用环境:Rocky Linux 9.5 / 三节点 / 2C·2G 虚拟机 / VMware VMnet2 host-only
部署日期:2026-10-10 | 部署方式:从干净快照克隆 + 脚本化部署(非手抄教材)
1. 集群规划
| 主机名 | IP | 角色 | 进程 |
|---|---|---|---|
| hadoop1 | 10.10.10.93 | Master | NameNode、SecondaryNameNode、ResourceManager、JobHistoryServer |
| hadoop2 | 10.10.10.94 | Slave | DataNode、NodeManager |
| hadoop3 | 10.10.10.95 | Slave | DataNode、NodeManager |
- 网段:VMware VMnet2 (host-only
10.10.10.0/24,网关.1)。该网段无外网。 - 规格:每台 2 vCPU / 2048 MB / 20GB 磁盘(
vmxnet3网卡 → guest 内为ens160)。 - 副本数:
dfs.replication = 2(坏一台不丢数据)。
2. 软件与版本
| 组件 | 版本 | 备注 |
|---|---|---|
| OS | Rocky Linux 9.5(Blue Onyx) | 内核 5.14.0-503.14.1.el9_5 |
| JDK | java-1.8.0-openjdk + -devel 1.8.0.432.b06-3.el9 |
devel 包才有 jps;从本地 DVD ISO 离线安装 |
| Hadoop | 3.3.6 | 宿主下载后扇出(节点无外网) |
| 运行用户 | hduser(组 hadoop,uid/gid 1001) |
禁止 root 跑 Hadoop |
| 虚拟机 | VMware Workstation 17.x(vmxnet3 / 独立 UUID+MAC) | 3D 加速已关(mks.enable3d=FALSE) |
4. 交付物清单
| 类别 | 文件 | 说明 |
|---|---|---|
| 脚本 | scripts/node-base-init.sh |
节点基础环境(hostname/IP/hosts/停服务/JDK/用户),幂等 |
| 脚本 | scripts/hadoop-setup.sh |
解压 + 写 4 个 XML + 分发从节点,幂等 |
| 脚本 | scripts/hadoop-cluster.sh |
format/start/stop/restart/status/report/wordcount |
| 工具 | tools/hctl.py |
宿主 → 三节点 SSH 控制(exec/put/get/discover) |
| 工具 | tools/hadoop-dashboard.py |
验收台(静态 HTML / --serve 实时版 / 关键状态日志) |
| 工具 | tools/lab-start.py |
一键启停入口(开机/--stop/--autostart/--status) |
| 工具 | D:\hadoop 实验\tools\vm-detach.ps1 |
脱离进程树开机(本机必需,见 §7 坑 3) |
| 验收 | Hadoop验收台.html · logs/验收关键状态.log |
静态快照 + 关键状态日志(只此一份,覆盖式) |
5. 从零部署(四步)
5.1 建虚拟机(从干净快照克隆)
bash
# ① 模板盘链:基础盘 = 干净快照;-000001/-000002 = 后续增量
# D:\rokey9.3\Rocky Linux 64 位.vmdk <- 独立根盘(parentCID=ffffffff) = "ok" 快照
# D:\rokey9.3\Rocky Linux 64 位-000002.vmdk <- 当前态 = iRedMail("mail"),不要用
# ② 合并成独立盘(13s/盘,约 5.8GB)
"vmware-vdiskmanager.exe" -r "D:\rokey9.3\Rocky Linux 64 位.vmdk" -t 0 "D:\hadoop 实验\hadoop1\hadoop1.vmdk"
# ③ 每台 .vmx 必改:displayName / nvme0:0.fileName / uuid.bios+location / MAC(static)
# / ethernet0.connectionType=custom + vnet=VMnet2 / mks.enable3d=FALSE / bios.bootOrder=hdd
开机命令(★ 本机必须走计划任务,不能直接 vmrun start):
powershell
# tools/vm-detach.ps1:注册无触发器计划任务 → 启动 → 注销
powershell -NoProfile -ExecutionPolicy Bypass -File "D:\hadoop 实验\tools\vm-detach.ps1" `
-Vmx "D:\hadoop 实验\hadoop1\hadoop1.vmx" -Op start
5.2 基础环境(三台,root)
bash
bash node-base-init.sh hadoop1 10.10.10.93 # 另两台同理,ID 换成 hadoop2/.94、hadoop3/.95
脚本做 9 件事:主机名 → /etc/hosts → 关 firewalld/禁 SELinux → 停无关服务 → 去 crashkernel
→ 建 hduser(abc123)+sudo → JDK 校验/离线装 devel → 静态 IP → 完成标记。
5.3 安装与配置(hadoop1)
bash
bash hadoop-setup.sh /root/hadoop-3.3.6.tar.gz
解压到 /home/hduser/hadoop → 建 tmp/dfs{name,data} → 写 hadoop-env.sh+4 个 XML+workers
→ 写 /etc/profile.d/hadoop.sh → scp 整个 hadoop 目录到 hadoop2/3 并改属主
→ 三台 md5 一致性核对。
5.4 启动与验收(hadoop1,hduser)
bash
su - hduser
bash /home/hduser/hadoop-cluster.sh format # 幂等:已格式化则跳过
bash /home/hduser/hadoop-cluster.sh start # start-dfs.sh + start-yarn.sh + historyserver
bash /home/hduser/hadoop-cluster.sh status # jps 三台
bash /home/hduser/hadoop-cluster.sh wordcount # 端到端
6. 核心配置文件($HADOOP_HOME/etc/hadoop/)
6.1 hadoop-env.sh / yarn-env.sh
bash
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.432.b06-3.el9.x86_64
★ 是 JDK 根 ,不是
/jre(写/jre则jps不可用)。
6.2 workers(3.x 取代 2.x 的 slaves)
hadoop2
hadoop3
6.3 core-site.xml
xml
<property><name>fs.defaultFS</name><value>hdfs://hadoop1:9000</value></property>
<property><name>hadoop.tmp.dir</name><value>/home/hduser/hadoop/tmp</value></property>
<property><name>hadoop.http.staticuser.user</name><value>hduser</value></property>
<property><name>io.file.buffer.size</name><value>131072</value></property>
6.4 hdfs-site.xml
xml
<property><name>dfs.namenode.name.dir</name><value>/home/hduser/hadoop/dfs/name</value></property>
<property><name>dfs.datanode.data.dir</name><value>/home/hduser/hadoop/dfs/data</value></property>
<property><name>dfs.replication</name><value>2</value></property>
<property><name>dfs.namenode.secondary.http-address</name><value>hadoop1:9868</value></property>
<property><name>dfs.webhdfs.enabled</name><value>true</value></property>
<property><name>dfs.datanode.max.transfer.threads</name><value>4096</value></property>
6.5 mapred-site.xml(★ 2GB 小机器必配 512MB,否则 AM 默认 1536MB 超 YARN 上限被拒)
xml
<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>
<property><name>yarn.app.mapreduce.am.resource.mb</name><value>512</value></property>
<property><name>mapreduce.map.memory.mb</name><value>512</value></property>
<property><name>mapreduce.reduce.memory.mb</name><value>512</value></property>
<property><name>yarn.app.mapreduce.am.env</name><value>HADOOP_MAPRED_HOME=/home/hduser/hadoop</value></property>
<property><name>mapreduce.map.env</name><value>HADOOP_MAPRED_HOME=/home/hduser/hadoop</value></property>
<property><name>mapreduce.reduce.env</name><value>HADOOP_MAPRED_HOME=/home/hduser/hadoop</value></property>
6.6 yarn-site.xml
xml
<property><name>yarn.resourcemanager.hostname</name><value>hadoop1</value></property>
<property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property>
<property><name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name><value>org.apache.hadoop.mapred.ShuffleHandler</value></property>
<property><name>yarn.resourcemanager.webapp.address</name><value>hadoop1:8088</value></property>
<property><name>yarn.nodemanager.resource.memory-mb</name><value>1024</value></property>
<property><name>yarn.nodemanager.resource.cpu-vcores</name><value>1</value></property>
<property><name>yarn.scheduler.minimum-allocation-mb</name><value>256</value></property>
<property><name>yarn.scheduler.maximum-allocation-mb</name><value>1024</value></property>
<property><name>yarn.nodemanager.pmem-check-enabled</name><value>false</value></property>
<property><name>yarn.nodemanager.vmem-check-enabled</name><value>false</value></property>
<property><name>yarn.nodemanager.env-whitelist</name><value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value></property>
6.7 版本差异速记(教材 2.x → 实际 3.3.6)
| 项目 | Hadoop 2.x(教材) | Hadoop 3.3.6 |
|---|---|---|
| 从节点列表 | slaves |
workers |
| NameNode Web UI | :50070 |
:9870 |
| SecondaryNameNode | :50090 |
:9868 |
| DataNode IPC | :50010 |
:9866 |
| 删除目录 | hdfs dfs -rmr |
hdfs dfs -rm -r |
7. 踩坑记录(本次实测,全部有据)
| # | 现象 | 根因 | 解决 |
|---|---|---|---|
| 1 | 🔴 克隆出的机器整整一套 iRedMail(postfix/dovecot/nginx/mariadb/clamd 全在,内存被吃掉 1.6GB) | 模板 D:\rokey9.3 有两个快照 :ok(uid1, 基础盘) 与 mail(uid4, 增量盘),snapshot.current=4 ⇒ 当前态就是装了邮件的状态。只看目录名看不出 |
改从基础盘 Rocky Linux 64 位.vmdk(独立根盘)克隆 → 干净基线内存仅 467MB |
| 2 | vmrun 启动的 VM 2 秒后掉电 ,vmware.log 无任何报错 |
GUI 虽在运行,但 vmrun 起的 vmware-vmx.exe 仍挂在 agent 进程树下;工具调用一结束,整棵树被回收 |
用无触发器计划任务 拉起(Register-ScheduledTask + Start-ScheduledTask,-RunLevel Limited,无需管理员)→ 实测存活 |
| 3 | PowerShell 工具跑 .ps1 直接失败、无回显 |
本机 ExecutionPolicy=Restricted;且工具 stdout 不回显 |
① 用 -ExecutionPolicy Bypass -File ;② 结果落盘再回读 |
| 4 | scp/hctl put 远端路径变成 D:/.../root/xxx |
MSYS 把参数与 heredoc 里的 \ / 互转 |
所有调用加 MSYS_NO_PATHCONV=1 MSYS2_ARG_CONV_EXCL="*" |
| 5 | jps 找不到,但 java 在 |
JAVA_HOME 指到了 .../jre,jps 只在 JDK 根 的 bin/ |
动态推导后再剥掉尾部 /jre ;缺 jps 就装 -devel |
| 6 | 节点 yum install 装不了 JDK |
VMnet2 host-only 无外网 | 挂载随 VM 一起挂上的 Rocky-9.5-x86_64-dvd.iso(/dev/sr0),建 file:///mnt/dvd/{BaseOS,AppStream} 本地仓库,--disablerepo='*' --enablerepo='dvd-*' 离线装 |
| 7 | root 执行 hdfs dfsadmin -report 看不到 Live datanodes 段(只有 20 行) |
NN 是 hduser 起的,HDFS 超级用户 = hduser,root 不是 ⇒ 报文里 DN 明细被隐藏 | 采集时加 HADOOP_USER_NAME=hduser 前缀(或 su - hduser -c) |
| 8 | 采集分节被「吞掉」:###DN 的值为 ###DEAD |
"空节 + 正则 lookahead"把下一节标记吃进内容 | 解析改按 ^###NAME$ 切分 (re.split),不依赖 lookahead |
| 9 | USTC 下载 696MB 中途掉到 ~0.1MB/s | 镜像带宽波动(实测 5 个镜像都只有 0.36--0.5 MB/s) | 耐心等;别并发重试多镜像 (只会互相挤)。关键动作是「宿主只下一份,再扇出」把 WAN 流量压到 1 份 |
8. 日常运维速查
bash
su - hduser
bash /home/hduser/hadoop-cluster.sh start|stop|restart|status|report|wordcount
hdfs dfsadmin -report # 节点容量/存活(root 执行需 HADOOP_USER_NAME=hduser)
hdfs dfs -ls / # 列 HDFS 根
hdfs dfs -put <本地> <HDFS路径> # 上传
hdfs dfs -get <HDFS路径> <本地> # 下载
hdfs dfs -cat <HDFS文件> # 查看
hdfs dfs -rm -r <HDFS路径> # 删除(3.x 用 -rm -r)
hdfs fsck / -files -blocks # 块分布
Web UI(宿主机浏览器直接开)
| 界面 | 地址 |
|---|---|
| HDFS NameNode | http://10.10.10.93:9870 |
| YARN ResourceManager | http://10.10.10.93:8088 |
| MapReduce JobHistory | http://10.10.10.93:19888 |
宿主侧一键入口
bash
PY="C:/Users/盟友/.workbuddy/binaries/python/envs/default/Scripts/python.exe"
"$PY" tools/lab-start.py # 开机启用(开 VM → 等 SSH → 起集群 → 出验收台 + 日志)
"$PY" tools/lab-start.py --serve # 同上并常驻实时验收台 http://127.0.0.1:8788
"$PY" tools/lab-start.py --status # 只看状态
"$PY" tools/lab-start.py --stop # 收摊(停集群 + 关 VM)
"$PY" tools/lab-start.py --autostart on # 开机自启(在 hadoop1 写 systemd 单元)
9. 验收结果(16/16 全部通过)
| 编号 | 检查项 | 实测 |
|---|---|---|
| V1 | 三台虚拟机已开机 | hadoop1, hadoop2, hadoop3 |
| V2 | 三台 SSH 可达 | 3/3 |
| V3 | 静态 IP 正确 | .93 / .94 / .95 |
| V4 | 主机名正确 | hadoop1/2/3 |
| V5 | JDK(jps) 就绪 | 1.8.0.432.b06-3.el9 ×3 |
| V6 | 防火墙关 / SELinux 非 enforcing | inactive ×3 / Permissive |
| V7--V9 | hadoop1 四进程 | NameNode / SecondaryNameNode / ResourceManager / JobHistoryServer |
| V10--V11 | hadoop2/3 | DataNode + NodeManager ×2 |
| V12 | HDFS Live DataNode | 2(dead=0) |
| V13 | 副本数 | 2 |
| V14 | WordCount 结果正确 | CHINA=1 HADOOP=1 Hello=2 World=1 hadoop=1 hi=2 |
| V15 | 三节点内存余量 | hadoop1 424MB / hadoop2 927MB / hadoop3 878MB(可用) |
| X1 | 额外 未改动既有实验机 | 本次仅运行 hadoop 三台 |
WordCount 原始输出
CHINA 1
HADOOP 1
Hello 2
World 1
hadoop 1
hi 2
作业计数器:Map input records=2、Reduce output records=6、Job ... completed successfully。