从零开始搭建 Hadoop 完全分布式集群(超详细图文指南)
面向零基础用户,手把手教你部署一个可运行的 Hadoop 完全分布式环境
一、前言:什么是"完全分布式"?
Hadoop 支持三种运行模式:
- 本地模式(Standalone) :单机运行,无 HDFS,仅用于调试。
- 伪分布式模式(Pseudo-Distributed) :单机模拟多进程,所有守护进程运行在同一台机器上。
- 完全分布式模式(Fully Distributed) :真正的集群部署,NameNode、DataNode、ResourceManager 等角色分布在多台物理或虚拟机上。
本文将带你从零开始,在 3 台 Linux 虚拟机 上搭建一个最小可用的 Hadoop 完全分布式集群(1 个 NameNode + 2 个 DataNode),适合学习、实验和小型开发环境。
二、准备工作
1. 硬件与软件要求
| 组件 | 要求 |
|---|---|
| 操作系统 | CentOS 7 / Ubuntu 20.04(推荐 CentOS 7) |
| 虚拟机数量 | 3 台(内存建议 ≥2GB/台) |
| JDK | OpenJDK 8 或 Oracle JDK 8(Hadoop 3.x 不兼容 JDK 11+ 的部分特性) |
| Hadoop 版本 | Hadoop 3.3.6(稳定版) |
💡 提示:本文以 CentOS 7 + Hadoop 3.3.6 + OpenJDK 8 为例。
2. 节点规划
| 主机名 | IP 地址 | 角色 |
|---|---|---|
| hadoop101 | 192.168.10.101 | NameNode, ResourceManager |
| hadoop102 | 192.168.10.102 | DataNode, NodeManager |
| hadoop103 | 192.168.10.103 | DataNode, NodeManager |
✅ 建议使用固定 IP,避免 DHCP 变化导致集群失效。
三、基础环境配置(每台机器都要做)
步骤 1:设置主机名
csharp
# 在 hadoop101 上执行
sudo hostnamectl set-hostname hadoop101
# 在 hadoop102 上执行
sudo hostnamectl set-hostname hadoop102
# 在 hadoop103 上执行
sudo hostnamectl set-hostname hadoop103
步骤 2:配置 hosts 文件(三台机器同步)
编辑 /etc/hosts,添加以下内容:
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
✅ 执行
ping hadoop102测试是否能解析。
步骤 3:关闭防火墙(实验环境)
arduino
sudo systemctl stop firewalld
sudo systemctl disable firewalld
🔒 生产环境应配置安全组或 iptables 规则,而非直接关闭。
步骤 4:安装 OpenJDK 8
sudo yum install -y java-1.8.0-openjdk-devel
验证安装:
java -version
javac -version
步骤 5:配置 SSH 免密登录(关键!)
Hadoop 集群依赖 SSH 进行节点间通信。需在 NameNode(hadoop101) 上生成密钥,并分发到所有节点。
python
# 在 hadoop101 上操作
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 分发公钥到所有节点(包括自己)
ssh-copy-id hadoop101
ssh-copy-id hadoop102
ssh-copy-id hadoop103
测试免密登录:
bash
ssh hadoop102 # 应无需密码直接登录
⚠️ 若提示"Permission denied",请确保目标机器的
/etc/ssh/sshd_config中PubkeyAuthentication yes已启用,并重启 sshd:sudo systemctl restart sshd
四、安装与配置 Hadoop
步骤 1:下载并解压 Hadoop
在 hadoop101 上操作:
bash
cd /opt
wget https://archive.apache.org/dist/hadoop/core/hadoop-3.3.6/hadoop-3.3.6.tar.gz
tar -zxvf hadoop-3.3.6.tar.gz
mv hadoop-3.3.6 hadoop
步骤 2:配置环境变量
编辑 ~/.bashrc(或 /etc/profile):
bash
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
生效配置:
bash
source ~/.bashrc
步骤 3:分发 Hadoop 到其他节点
bash
scp -r /opt/hadoop hadoop102:/opt/
scp -r /opt/hadoop hadoop103:/opt/
并在 hadoop102、hadoop103 上同样配置 ~/.bashrc 中的环境变量。
五、核心配置文件修改(在 hadoop101 上操作)
进入 $HADOOP_HOME/etc/hadoop 目录,修改以下文件:
1. core-site.xml
xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/data/tmp</value>
</property>
</configuration>
2. hdfs-site.xml
xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value> <!-- 副本数不超过 DataNode 数量 -->
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop/data/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/hadoop/data/datanode</value>
</property>
</configuration>
3. yarn-site.xml
xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop101</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value> <!-- 避免内存检查失败 -->
</property>
</configuration>
4. mapred-site.xml
xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
5. workers 文件(替代旧版 slaves)
hadoop102
hadoop103
✅ 注意:Hadoop 3.x 使用
workers文件定义 DataNode 和 NodeManager 节点。
六、格式化 NameNode 并启动集群
1. 格式化 HDFS(仅首次执行!)
lua
hdfs namenode -format
⚠️ 重复执行会清空 HDFS 数据!
2. 启动 HDFS
sql
start-dfs.sh
3. 启动 YARN
sql
start-yarn.sh
4. 验证进程
- hadoop101 应有:NameNode、SecondaryNameNode、ResourceManager
- hadoop102 / hadoop103 应有:DataNode、NodeManager
使用 jps 命令查看。
5. Web UI 验证
- HDFS 管理界面:http://hadoop101:9870
- YARN 资源管理器:http://hadoop101:8088
✅ 若无法访问,请检查防火墙或网络配置。
七、运行 WordCount 示例测试
bash
# 创建 HDFS 目录
hdfs dfs -mkdir /input
# 上传本地文件
echo "hello hadoop hello world" > /tmp/test.txt
hdfs dfs -put /tmp/test.txt /input
# 运行 MapReduce 任务
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /input /output
# 查看结果
hdfs dfs -cat /output/*
若输出:
hadoop 1
hello 2
world 1
说明集群运行成功!
八、常见问题排查
| 问题 | 解决方案 |
|---|---|
| DataNode 无法启动 | 检查 workers 文件、SSH 免密、时间同步 |
| NameNode 格式化失败 | 删除 hadoop.tmp.dir 目录后重试 |
| Web UI 无法访问 | 关闭防火墙或开放 9870/8088 端口 |
| "NativeIO" 报错 | 忽略(不影响功能),或编译 native 库 |
九、结语
通过本文,你已成功搭建了一个 3 节点的 Hadoop 完全分布式集群。虽然步骤较多,但每一步都是理解 Hadoop 架构的关键。掌握此过程,不仅有助于学习大数据生态(如 Hive、HBase、Spark),也为后续深入分布式系统打下坚实基础。