接上篇,上回我们把CentOS7装好,网络改成固定IP,配了JDK8,Hadoop3也解压到了/opt/hadoop-3.3.6,还专门建了hadoop用户来跑服务。如果你是从零开始,建议先把环境准备那篇看完,因为后面所有命令都基于那个基础。如果已经准备好了,这篇就直接进入正题:改配置、格式化NameNode、启动HDFS和Yarn、跑通WordCount、遇到问题怎么排查。这篇文章我按实际操作的顺序来写,不是把官方文档翻译一遍,而是把每一步背后的原因和踩过的坑一起说出来。
这里我采用的方案是伪分布式,也就是一台CentOS7机器模拟整个Hadoop集群。NameNode、DataNode、ResourceManager、NodeManager都跑在同一台机器上,这个方案最适合新手理解运行机制,也足够应付后续学习MapReduce和HDFS API。生产环境的多节点集群,我会在最后聊一下和伪分布式的差异,但配置思路是相通的。
1. 动手前的环境确认与配置思路
1.1 先把上篇的成果检查一遍
很多人照着教程装完Hadoop,到了下篇发现跑不起来,绝大部分原因是前面某个环节没做干净。所以我建议不要急着打开xml配置文件,先花两分钟确认这些内容是否就绪。
bash复制# 确认hadoop用户存在
id hadoop
# 确认JDK版本
java -version
# 确认Hadoop解压目录
ls -ld /opt/hadoop-3.3.6
# 确认hadoop命令能被找到
su - hadoop
echo $HADOOP_HOME
hadoop version
我自己习惯用hadoop用户操作,不用root直接跑服务。原因很简单:Hadoop的DataNode和NodeManager在运行期会写大量数据,如果数据目录归属root,后面排查权限问题会特别痛苦。伪分布式虽然不会像集群那么严格,但从一开始养成好习惯,以后接触真实集群少踩坑。
如果你发现HADOOP_HOME是空的,说明上篇的环境变量没配好,先回去补上。需要注意,环境变量一般配在~/.bash_profile里,有些教程让配在/etc/profile,也都没问题,关键是当前登录用户能读到。用hadoop用户执行hadoop version前,记得重新source一下,或者直接重新登录一次。
1.2 伪分布的目录规划和内存预估
Hadoop启动后会涉及两类目录:一类是NameNode和DataNode的元数据及数据目录,另一类是运行日志目录。默认情况下,Hadoop会把数据写到/tmp下,这是个隐藏坑,因为系统重启后/tmp可能被清理,而且/tmp空间也可能不够。所以上篇我建议你规划一个独立的数据盘或者分区,如果机器是虚拟机演示用,至少把数据目录放到/opt/hadoop_data这样不容易被误清的地方。
内存方面,伪分布式不像集群那么吃紧,但也不是随便一台机器都能跑。NameNode、SecondaryNameNode、ResourceManager、DataNode、NodeManager这五个Java进程加在一起,初始堆内存大约2GB左右。所以虚拟机内存建议不小于4GB,如果是2GB内存,光把服务启动起来就会很勉强,跑WordCount时很容易整机卡死。我给测试机的配置是4核4GB,磁盘空间预留20GB以上,装完CentOS7系统后再装Hadoop,剩余空间基本够用。
Hadoop3的进程统一由hdfs和yarn脚本管理,很多新手会把Hadoop2时代的start-all.sh习惯带过来。实际上Hadoop3还在用start-dfs.sh和start-yarn.sh,但更推荐分别启动,方便定位是HDFS出问题还是Yarn出问题。判断一个服务启动慢还是启动失败,需要学会看日志,而不是反复重启试运气。
1.3 Hadoop3默认端口和防火墙的关系
CentOS7默认防火墙是firewalld,很多教程直接让新手systemctl stop firewalld,测试阶段没毛病,但我想多解释一句:如果只是本机跑,不用特意关防火墙,但一旦要通过其他机器访问管理界面,就必须放行对应端口。Hadoop3各组件默认端口如下:
| 组件 | 默认端口 | 用途 |
|---|---|---|
| NameNode Web UI | 9870 | HDFS管理界面,Hadoop3改成了9870,不是Hadoop2的50070 |
| DataNode通信端口 | 9866 | DataNode与NameNode的数据传输 |
| DataNode Web UI | 9864 | 查看单个DataNode状态 |
| ResourceManager Web UI | 8088 | Yarn任务管理界面 |
| NodeManager通信端口 | 8042 | NodeManager与ResourceManager通信 |
伪分布式测试阶段,如果不想关闭防火墙,可以执行这些命令把常用端口放出来:
bash复制sudo firewall-cmd --permanent --add-port=9870/tcp
sudo firewall-cmd --permanent --add-port=9866/tcp
sudo firewall-cmd --permanent --add-port=9864/tcp
sudo firewall-cmd --permanent --add-port=8088/tcp
sudo firewall-cmd --permanent --add-port=8042/tcp
sudo firewall-cmd --reload
如果你用的是云服务器,除了系统防火墙,安全组规则也要一起放开。我曾经遇到过本地页面全部打不开,排查到最后发现是云控制台的安全组没放行端口,这类问题外表看像Hadoop启动失败,实际和服务本身毫无关系。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 四个核心配置文件的修改逻辑与实操
2.1 core-site.xml:先告诉Hadoop谁是老大
Hadoop启动时首先会
