第一次搭Hadoop完全分布式,我在同一个坑里踩了整整两天:node01 的 jps 一切正常,node02 和 node03 的 DataNode 就是起不来。后来翻日志才发现,问题是出在我担心启动失败,连续执行了两次 hdfs namenode -format。这种“格式化一时爽,排查火葬场”的经历,在零基础阶段真的太典型了。
今天我用一边搭建一边解释原理的方式,把 Hadoop 完全分布式的整个过程重新梳理一遍。文章不讲高深理论,只讲你从零开始需要做什么、每步为什么要这样做,以及在哪个环节最容易翻车。适合第一次接触分布式、照着伪分布式教程成功后想进一步搭建多节点集群的读者。
1. 搭建之前,先搞清楚完全分布式和伪分布式差在哪
1.1 从一个小卖部模型说起
很多人一开始会困惑:我在一台电脑上明明也能跑 Hadoop,为什么要折腾多台机器?
单机模式(Local Mode)里,Hadoop 连 HDFS 都没启动,输入输出都在本地文件系统上,MapReduce 也只在单个 JVM 里跑,它存在的意义主要是本地调试。伪分布式(Pseudo-Distributed Mode)虽然启动了 NameNode、DataNode 这些进程,但所有进程都在同一台机器上,就像一个公司所有员工都挤在一间屋子里上班,能模拟出“岗位分工”,却完全没有体现分布式真正的容错和扩展能力。
完全分布式是把不同角色真正拆到不同机器上。用一个更生活化的类比:NameNode 是公司的财务和档案室,负责记“每份文件放在哪个仓库的哪个货架”;DataNode 是真正的仓库管理员,实际保管文件内容;ResourceManager 是项目调度中心,安排计算任务去哪些仓库存取数据。如果财务、档案室、仓库全在一间屋子里,小规模可以运转,但数据量一大,这间屋子早晚被塞满,一个人也忙不过来。
1.2 完全分布式里到底有哪些角色
零基础阶段,你不需要把 Hadoop 每个组件都吃透,但至少要知道这几个进程各管什么:
| 进程名 | 所属组件 | 核心职责 | 最容易理解的一句话 |
|---|---|---|---|
| NameNode | HDFS | 管理文件系统的元数据 | 只记账本,不存实际数据块 |
| DataNode | HDFS | 实际存储数据块 | 真正管货架的仓库员 |
| SecondaryNameNode | HDFS | 定期合并元数据日志 | 给 NameNode 做个“定期的账目整理”,不是热备 |
| ResourceManager | YARN | 接收作业、分配资源 | 项目总调度,决定任务给谁跑 |
| NodeManager | YARN | 在单机上启动任务容器 | 每个节点上的“包工头” |
看到“完全分布式”,你要在脑子里建立的第一个判断是:NameNode 这台机器不能被称为“存储所有数据的服务器”,它存的是目录结构、文件与数据块的映射关系这类元数据,真正的文件内容被打散成一块一块(默认 128MB 一个块),存放在多台 DataNode 上。很多零基础的人搭完集群后,去 DataNode 目录里看不到那种“我一眼能看懂的文件”,这是正常的,因为块文件由框架管理。
1.3 文件读写流程:把“为什么分角色”讲透
读一个文件时,客户端会先访问 NameNode,问“我想读 /data/a.txt,它的数据块在哪些机器上”,NameNode 查询元数据后返回块位置列表,例如“block 1 在 node02 和 node03,block 2 在 node01 和 node02”。然后客户端直接去对应的 DataNode 读取内容,不再经过 NameNode。这种设计让 NameNode 只承担非常轻量的路径索引工作,真正的数据传输压力分散到各个 DataNode 上。
写文件时也类似:客户端先问 NameNode“我要创建一个文件,应该把第一个数据块写到哪两台机器”,NameNode 基于机架感知甚至磁盘空间情况,给出一份 DataNode 写入列表。客户端随后把数据块依次传输给第一个 DataNode,再由它复制给下一个 DataNode,形成流水线复制。这就是 HDFS 默认三副本策略背后的分布式传输逻辑。
零基础理解完这个小节,就可以开始准备机器了。因为后面所有配置文件里填的主机名、端口,本质上都是为了让这些角色在正确的机器上运行起来。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 三台机器从零准备:硬件、系统、网络里的大坑
2.1 到底需要几台机器,配置怎么定
完全分布式最少需要两台机器,因为要保证元数据节点和数据节点在不同机器上;但学习阶段我不建议只准备两台。原因有两个:第一,HDFS 的默认副本数是 3,如果只有 2 个数据节点,第三个副本永远没有地方可放,集群状态会一直告警;第二,很多 HDFS 操作只有配合多个节点才能观察到数据块的复制和分散效果。
最舒服的配置是三台虚拟机,一台作为主节点(NameNode + ResourceManager),另外两台作为从节点。如果你电脑内存只有 16GB,我给出一份实测比较稳的配置:
| 角色 | 主机名 | 推荐内存 | 推荐磁盘 | 主要运行进程 |
|---|---|---|---|---|
| 主节点 | node01 | 3GB 以上,最好 4GB | 50GB | NameNode、ResourceManager |
| 从节点 | node02 | 2GB 以上 | 50GB | DataNode、NodeManager、SecondaryNameNode |
| 从节点 | node03 | 2GB 以上 | 50GB | DataNode、NodeManager |
三台虚拟机可以都跑在一台物理电脑上,不建议一上来就买三台云服务器,因为按量计费可能让你在实验过程中一直焦虑。用 VMware Workstation 或 VirtualBox 都可以,创建第一台虚拟机后,另外两台用“克隆”方式生成,能省去重复安装系统的大量时间。
2.2 克隆后的虚拟机最容易犯的错:主机名和 IP 没改
克隆虚拟机最大的优势是快,但有个连锁坑:克隆出来的机器会沿用源虚拟机的 MAC 地址、hostname 和网卡配置。如果你在 VMware 里使用“完整克隆”,创建向导通常会问你是否重新初始化 MAC 地址,一定要选“是”。
创建完三台虚拟机后,先分别执行 hostnamectl set-hostname 把主机名改成 node01、node02、node03,然后固定 IP。固定 IP 建议用 NAT 模式,因为这样虚拟机之间通过虚拟交换机可以互通,同时也能上网下载依赖包。以 CentOS 7.9 或后续兼容版本为例,改网卡配置的典型操作是编辑 /etc/sysconfig/network-scripts/ifcfg-ens33,把 BOOTPROTO="static" 并追加 IP 信息。如果用的是 Ubuntu Server 或带 Netplan 的版本,路径和格式会不一样,核心思路是同样的:每台机器给一个固定内网 IP。
我常用的 IP 规划是这样的:
- node01:192.168.10.101
- node02:192.168.10.102
- node03:192.168.10.103
改了网卡后记得重启网络服务,或者直接重启虚拟机,再执行 ip addr 确认 IP 生效。如果发现三台机器互相 ping 不通,先检查 VMware 的虚拟网络编辑器里 NAT 网段是否和你的静态 IP 在同一网段。零基础阶段最容易出现的问题是:宿主机无线网卡也占用了一个 192.168.10.x 网段,导致虚拟网络和物理网络冲突,这时换一个不常用的网段比如 192.168.56.x 就能解决
