1. 目标与前提
本篇教程假设你刚刚完成一台 CentOS 的最小化安装,系统还没有配置业务环境。我们将从环境准备开始,逐步完成 JDK 安装、Hadoop 安装与配置文件编写,最终分别演示两种部署方式:
- 伪分布式模式:所有 Hadoop 守护进程运行在同一台机器上,适合学习和开发调试。
- 完全分布式模式:NameNode、ResourceManager、DataNode、NodeManager 分散部署在多台服务器上,更接近真实生产环境。
本文以 CentOS 7/8/Stream 和 Hadoop 3.3.x 为主要环境,其他版本操作基本一致,只需替换对应软件包即可。
2. 环境准备与节点规划
伪分布式只需要一台机器;完全分布式建议准备至少 3 台机器。为了方便演示,我们统一做如下规划:
| 主机名 | IP 地址 | 角色 |
|---|---|---|
| hadoop01 | 192.168.1.101 | NameNode、ResourceManager |
| hadoop02 | 192.168.1.102 | DataNode、NodeManager |
| hadoop03 | 192.168.1.103 | DataNode、NodeManager |
如果你的实验环境只有一台机器,可以先完成伪分布式部署;后面进入完全分布式章节时,再把 3 台机器的基础环境准备好。
3. 基础系统配置
3.1 关闭防火墙和 SELinux
Hadoop 集群在启动、运行过程中需要大量端口通信。为了减少排查成本,实验环境建议先关闭防火墙和 SELinux。生产环境则应按需开放端口并配置安全策略。
# 停止并禁用 firewalld
systemctl stop firewalld
systemctl disable firewalld
临时关闭 SELinux
setenforce 0
永久关闭 SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
3.2 设置主机名和 hosts
Hadoop 组件之间会通过主机名相互访问,因此必须保证主机名、IP 和 hosts 映射一致。分别在每台机器上执行:
# 在 hadoop01 上设置主机名
hostnamectl set-hostname hadoop01
在 hadoop02 上设置主机名
hostnamectl set-hostname hadoop02
在 hadoop03 上设置主机名
hostnamectl set-hostname hadoop03
然后在每台机器的 /etc/hosts 文件中增加如下内容:
192.168.1.101 hadoop01
192.168.1.102 hadoop02
192.168.1.103 hadoop03
执行 ping hadoop01、ping hadoop02、ping hadoop03 验证互相能够解析到正确地址。
3.3 安装基础工具
yum install -y wget vim net-tools openssh-clients rsync
4. 创建 Hadoop 用户并配置 SSH 免密
Hadoop 不建议直接使用 root 用户运行。我们在每台机器上创建统一的 hadoop 用户,并配置该用户之间的 SSH 免密登录。
# 创建 hadoop 用户,并设置密码
useradd hadoop
passwd hadoop
赋予 hadoop 用户 sudo 权限
echo "hadoop ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
切换到 hadoop 用户,生成密钥并把公钥分发到包括自己在内的所有节点:
su - hadoop
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
在每台机器上执行,把公钥复制到目标机器
ssh-copy-id hadoop01
ssh-copy-id hadoop02
ssh-copy-id hadoop03
完成后执行 ssh hadoop02,如果能免密登录则说明配置成功。伪分布式模式下只需配置 ssh-copy-id hadoop01 让本机可以免密访问自己。
5. 安装 JDK
Hadoop 运行依赖 Java 环境。以 JDK 8 为例,先在官网下载 jdk-8uXXX-linux-x64.tar.gz,上传到服务器后执行:
# 创建安装目录
sudo mkdir -p /usr/local/java
解压 JDK,注意替换实际文件名
sudo tar -zxf jdk-8u351-linux-x64.tar.gz -C /usr/local/java
配置环境变量
sudo vim /etc/profile
在 /etc/profile 末尾追加:
export JAVA_HOME=/usr/local/java/jdk1.8.0_351
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
保存后使配置生效并验证:
source /etc/profile
java -version
如果输出 JDK 版本信息,说明 Java 环境已经可用。
6. 下载并安装 Hadoop
以 Hadoop 3.3.6 为例,下载二进制包并解压到统一目录:
# 下载 Hadoop 3.3.6
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
解压
sudo tar -zxf hadoop-3.3.6.tar.gz -C /usr/local
重命名并调整属主
sudo mv /usr/local/hadoop-3.3.6 /usr/local/hadoop
sudo chown -R hadoop:hadoop /usr/local/hadoop
配置环境变量
sudo vim /etc/profile
在 /etc/profile 末尾追加:
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
使配置生效:
source /etc/profile
hadoop version
7. 配置 Hadoop 核心环境
下面几个文件是 Hadoop 伪分布式和完全分布式都会用到的,可以先统一配置。
7.1 配置 hadoop-env.sh
vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
找到并修改 Java 环境变量:
export JAVA_HOME=/usr/local/java/jdk1.8.0_351
7.2 配置 core-site.xml
编辑 $HADOOP_HOME/etc/hadoop/core-site.xml,在 <configuration> 内添加:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/data/tmp</value>
</property>
</configuration>
其中 fs.defaultFS 指定默认文件系统;hadoop.tmp.dir 指定临时数据目录,伪分布式和完全分布式都需要提前创建该目录。
7.3 配置 hdfs-site.xml
编辑 $HADOOP_HOME/etc/hadoop/hdfs-site.xml。伪分布式模式建议使用如下配置:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop/data/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop/data/datanode</value>
</property>
</configuration>
完全分布式模式中,dfs.replication 建议设置为真实副本数,例如 2 或 3。
7.4 配置 mapred-site.xml
默认目录下通常只有一个模板文件 mapred-site.xml 不存在,可以通过复制模板或直接新建:
cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xml
vim $HADOOP_HOME/etc/hadoop/mapred-site.xml
添加 YARN 执行框架配置:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
7.5 配置 yarn-site.xml
编辑 $HADOOP_HOME/etc/hadoop/yarn-site.xml,添加如下配置:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
</configuration>
如果只是学习伪分布式且不运行 MapReduce 任务,可以先不启用 YARN;但为了完整演示,这里统一配置 YARN。
8. 伪分布式部署与验证
伪分布式模式下,NameNode、SecondaryNameNode、DataNode、ResourceManager 和 NodeManager 都运行在同一台机器上。若你只有一台机器,把主机名按 hadoop01 配置即可。
8.1 创建数据目录并格式化 NameNode
mkdir -p /usr/local/hadoop/data/tmp
mkdir -p /usr/local/hadoop/data/namenode
mkdir -p /usr/local/hadoop/data/datanode
首次启动前格式化 NameNode
hdfs namenode -format
看到 Storage directory ... has been successfully formatted 表示格式化成功。格式化只能执行一次,重复格式化会生成新的集群 ID。
8.2 启动 HDFS 和 YARN
# 启动 HDFS
$HADOOP_HOME/sbin/start-dfs.sh
启动 YARN
$HADOOP_HOME/sbin/start-yarn.sh
如果是 Hadoop 3.x,也可以通过 start-all.sh 同时启动 HDFS 和 YARN,但官方更推荐分别启动,便于单独定位问题。
8.3 检查进程和端口
jps
伪分布式正常启动后,通常会看到如下进程:
NameNodeSecondaryNameNodeDataNodeResourceManagerNodeManager
也可以通过 Web UI 访问 NameNode 和 ResourceManager:
- NameNode:
http://hadoop01:9870 - ResourceManager:
http://hadoop01:8088
8.4 运行 WordCount 验证
# 在 HDFS 中创建输入目录
hdfs dfs -mkdir -p /user/hadoop/input
准备测试文本
echo "hello hadoop hello world" > /tmp/wordcount.txt
hdfs dfs -put /tmp/wordcount.txt /user/hadoop/input
运行 MapReduce WordCount 示例
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /user/hadoop/input /user/hadoop/output
查看统计结果
hdfs dfs -cat /user/hadoop/output/part-r-00000
如果能输出每个单词的出现次数,说明伪分布式 Hadoop 已经可以正常运行 MapReduce 任务。
9. 完全分布式部署
完全分布式模式下,我们使用 3 台机器,hadoop01 作为管理节点运行 NameNode 和 ResourceManager,hadoop02、hadoop03 作为工作节点运行 DataNode 和 NodeManager。
9.1 完成 3 台机器的基础准备
按照第 2 到第 6 节,分别在 3 台机器上完成以下配置:
- 主机名与 hosts 映射。
- 创建 hadoop 用户。
- 配置 SSH 免密登录。
- 安装 JDK。
- 安装并解压 Hadoop 到统一目录。
9.2 配置 workers 文件
编辑 $HADOOP_HOME/etc/hadoop/workers,写入所有 DataNode 节点的主机名:
hadoop02
hadoop03
9.3 调整完全分布式配置
在 hadoop01 上修改 hdfs-site.xml,将副本数调整为 2:
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop/data/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop/data/datanode</value>
</property>
</configuration>
其他配置文件保持第 7 节中的配置即可。注意 core-site.xml、yarn-site.xml 中的主机名都要指向 hadoop01。
9.4 分发配置到所有节点
# 将配置好的 Hadoop 目录同步到 hadoop02 和 hadoop03
rsync -avz --delete $HADOOP_HOME/ hadoop@hadoop02:$HADOOP_HOME/
rsync -avz --delete $HADOOP_HOME/ hadoop@hadoop03:$HADOOP_HOME/
9.5 创建目录并格式化 NameNode
在每台机器上创建相应数据目录:
# hadoop01 执行
mkdir -p /usr/local/hadoop/data/tmp /usr/local/hadoop/data/namenode
hadoop02 和 hadoop03 执行
mkdir -p /usr/local/hadoop/data/tmp /usr/local/hadoop/data/datanode
然后在 hadoop01 上格式化 NameNode:
hdfs namenode -format
9.6 启动完全分布式集群
# 在 hadoop01 上启动 HDFS,脚本会根据 workers 文件远程启动 DataNode
$HADOOP_HOME/sbin/start-dfs.sh
启动 YARN
$HADOOP_HOME/sbin/start-yarn.sh
9.7 验证集群状态
分别在 3 台机器上执行 jps 检查进程:
- hadoop01 应看到
NameNode、SecondaryNameNode、ResourceManager。 - hadoop02 和 hadoop03 应看到
DataNode、NodeManager。
也可以执行 hdfs dfsadmin -report 查看 DataNode 是否全部在线:
hdfs dfsadmin -report
如果 Live datanodes (2) 显示为 2,说明两个 DataNode 都已正常注册。继续上传文件:
hdfs dfs -mkdir -p /test
hdfs dfs -put /etc/hosts /test/hosts.txt
hdfs dfs -ls /test
再运行一次 WordCount,观察任务是否在 YARN 上调度执行:
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /test /test-output
10. 常见问题排查
10.1 集群节点无法互相免密登录
检查每台机器的 hosts 文件是否一致,确认公钥已复制到目标机器的 /home/hadoop/.ssh/authorized_keys,并确保该文件和 .ssh 目录权限正确。
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
10.2 DataNode 无法启动或数量不足
常见原因是集群 ID 不一致。如果 NameNode 格式化过多次,DataNode 中保存的旧集群 ID 会导致注册失败。可以停止集群后清理 DataNode 数据目录中的 current 目录,再重新启动。
# 停止集群
$HADOOP_HOME/sbin/stop-all.sh
清理 DataNode 数据目录后重启
rm -rf /usr/local/hadoop/data/datanode/current
10.3 端口被占用或无法访问 Web UI
检查防火墙和 SELinux 是否已关闭,并使用 netstat -tlnp 查看 9000、9870、8088 等端口监听状态。若修改过配置文件,建议重启对应服务后再验证。
10.4 权限问题
Hadoop 数据目录应属于 hadoop 用户。如果曾使用 root 启动过服务,可能出现目录属主错误,可使用 chown -R hadoop:hadoop /usr/local/hadoop 修复。
11. 总结
本文从一台新装 CentOS 出发,完整介绍了 Hadoop 部署所需的基础环境配置、JDK 安装、Hadoop 配置方法,以及伪分布式和完全分布式两种部署模式。伪分布式适合单机快速学习;完全分布式更贴近生产环境,能够展示 NameNode、DataNode、ResourceManager 和 NodeManager 的分工协作。
在真实生产环境中,还需要进一步关注容量规划、数据目录多盘配置、高可用 NameNode、资源调度策略和安全认证等问题。建议在完全分布式跑通后,再逐步学习 HDFS 权限、YARN 队列以及集群监控等进阶内容。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/u010674283/article/details/169527246



