很久没写Hadoop相关的实操文章了,这两天刚好帮一个零基础的朋友从裸机开始搭了一套完全分布式环境,踩了一路的坑,也把很多以前知其然不知其所以然的点彻底搞明白了。趁热把整个过程整理出来,从规划、安装、配置到启动验证,全流程走一遍。这篇东西不假设你有任何Hadoop基础,但希望你至少会基本的Linux命令,比如cd、vim、tar这类,如果你连这些也不熟,建议先花半小时熟悉一下再来看。
1. 为什么我不推荐你从伪分布式开始学
很多教程喜欢先让你搭伪分布式,也就是在一台机器上同时跑NameNode、DataNode、ResourceManager、NodeManager。伪分布式的确能帮你快速跑通一个WordCount,但它会掩盖一个严重的问题:你对“分布式”这三个字没有任何体感。你没有亲手配置过集群节点之间的通信,没有体验过SSH免密的必要性,也不明白为什么DataNode连不上NameNode的时候日志会那么让人崩溃。
完全分布式是正儿八经的多台机器协作:一台机器当“领导”,其余的当“干活的”。你把文件扔进去,它会切块分发到不同机器上,这一过程涉及网络通信、心跳汇报、元数据管理。这些东西不亲手搭一遍,只在文档里看,永远建立不起来直观认识。
所以我的建议是:哪怕你手上只有一台8G内存的电脑,也建议用虚拟机拆出3台来,这里面的网络配置、角色划分、进程通信,都是真实分布式环境的缩小版,踩过的坑将来上了生产环境一样能碰上,只是规模不同。
另外声明一下:这篇文章以Hadoop 3.3.6为基准,JDK用的是Hadoop官方推荐的Java 8(OpenJDK 1.8.0_392)。虽然新版Hadoop开始支持Java 11甚至17,但生产环境里用Java 8的仍然占绝大多数,而且Hadoop 3.x对Java 8的支持最成熟,零基础起步选它最稳。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与集群规划:先把丑话说在前面
2.1 硬件与系统要求
所谓完全分布式,至少需要两台机器,一台做Master,一台做Worker。但在实际学习中,两台的容错率太低,比如你把NameNode和SecondaryNameNode放在同一台机器上,配置稍微写错就容易起冲突,排查起来也麻烦。我这里用的是三台虚拟机:1台Master + 2台Worker,这是最经典、最适合入门、也不算浪费资源的方案。
每台虚拟机的配置建议如下:
| 配置项 | 最低要求 | 推荐配置 | 说明 |
|---|---|---|---|
| CPU | 1核 | 2核 | 编译和启动阶段会比较吃力 |
| 内存 | 2GB | 3~4GB | 至少保证2GB可用,否则Java进程起不来 |
| 磁盘 | 20GB | 40GB | 主要是HDFS的存储目录和日志会占用空间 |
| 操作系统 | CentOS 7 | CentOS 7.9 / Ubuntu 20.04 | 本文以CentOS 7.9为例 |
| 网络 | NAT模式 | NAT模式 | 虚拟机之间互通,并能够访问外网 |
内存这个点我必须多说一句。很多人用1G内存的虚拟机跑Hadoop,结果启动的时候各种奇奇怪怪的报错,比如进程启动后马上就消失了,或者JVM直接OOM。Hadoop的每个Java进程默认就会占几百MB内存,3台机器加起来光跑基础服务就需要6GB以上的物理内存。如果你电脑是16GB内存,建议每台虚拟机给3GB左右,总共9GB,剩下的留给宿主机,这样最稳。
2.2 主机名与IP地址规划
这一步是很多零基础教程忽略但极其重要的环节。Hadoop集群内部是通过主机名进行通信的,HDFS的配置文件和Hadoop自身的脚本都大量依赖主机名的解析。如果你不给每台机器配好主机名并写入/etc/hosts,后面启动集群时就会出现“连不上”的诡异问题,日志里还看不出明显原因。
我的建议规划如下:
| 角色 | 主机名 | IP地址 | 运行的服务 |
|---|---|---|---|
| Master | hadoop-master | 192.168.10.101 | NameNode、SecondaryNameNode、ResourceManager、HistoryServer |
| Worker1 | hadoop-worker1 | 192.168.10.102 | DataNode、NodeManager |
| Worker2 | hadoop-worker2 | 192.168.10.103 | DataNode、NodeManager |
这里有一个非常关键的决策点:谁当Master? 很多人习惯在Windows或者自己的主力开发机上直接装,但我强烈建议所有节点都使用Linux虚拟机,因为Hadoop的生产环境基本不会部署在Windows上,而且Linux环境下的排查工具(比如ss、jps、lsof)用起来比Windows顺手得多。
2.3 基础环境配置:关闭防火墙与SELinux
这一步容易被新手忽略。CentOS默认开启了firewalld,Hadoop各个节点之间的通信会被它拦掉,导致集群看起来启动了,但DataNode一直连不上NameNode。我在第一次搭建时就吃过这个亏,检查了半小时配置文件,最后发现就是防火墙没关。
bash复制# 三台机器都执行
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
关闭SELinux后需要重启虚拟机生效,实际上如果你只是临时学习,不重启也能继续,但建议还是重启一次,让环境干净一点。
3. 基础环境配置:SSH免密与JDK安装
3.1 修改主机名并配置hosts映射
先给三台机器设置主机名,这个操作要在每台机器上分别执行:
bash复制# hadoop-master 上执行
hostnamectl set-hostname hadoop-master
# hadoop-worker1 上执行
hostnamectl set-hostname hadoop-worker1
# hadoop-worker2 上执行
hostnamectl set-hostname hadoop-worker2
然后三台机器都要编辑/etc/hosts,把三台机器的映射关系都放进去:
bash复制cat >> /etc/hosts <<EOF
192.168.10.101 hadoop-master
192.168.10.102 hadoop-worker1
192.168.10.103 hadoop-worker2
EOF
为什么需要hosts文件?因为Hadoop集群内部的通信会通过主机名去解析IP。如果你每台机器只配了自己的hosts而没配别人的,那么在Master上通过主机名去连Worker1时,它会先查hosts文件,查不到就报Unknown
