hadoop三种运行模式详解:从单机调试到集群部署
Hadoop 提供三种运行模式,分别适配 开发调试、功能验证、生产环境 不同场景。本文将详细解析单机模式、伪分布式模式和完全分布式模式的配置方法、适用场景及核心差异,帮助读者快速搭建符合需求的 Hadoop 环境。
Hadoop 运行模式概述
Hadoop 的三种运行模式本质上是 集群规模和资源隔离程度 的差异,核心组件(HDFS、YARN、MapReduce)的启动方式和交互逻辑随模式变化:
| 模式 |
核心特点 |
适用场景 |
组件启动情况 |
| 单机模式 |
无分布式进程,所有组件运行在单个 JVM 中 |
开发调试、单元测试 |
无守护进程(NameNode、DataNode 等均不启动) |
| 伪分布式模式 |
单个节点模拟集群,所有组件以守护进程形式运行 |
功能验证、小规模测试 |
NameNode、DataNode、ResourceManager 等均启动(单节点) |
| 完全分布式模式 |
多节点组成集群,组件分布在不同物理机 |
生产环境、大规模数据处理 |
组件分布式部署(如 NameNode 在主节点,DataNode 在从节点) |
通用前置配置
无论哪种模式,均需先配置 Java 环境 和 Hadoop 环境变量:
配置 JAVA_HOME
修改 hadoop-env.sh(位于 $HADOOP_HOME/etc/hadoop/),指定 Java 安装路径:
1 2 3 4 5
| # 编辑配置文件 vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
# 添加 Java 路径(需替换为实际路径) export JAVA_HOME=/usr/local/jdk1.8.0_261
|
验证 Hadoop 安装
执行以下命令查看 Hadoop 版本,确认安装成功:
1
| $HADOOP_HOME/bin/hadoop version
|
单机模式(Standalone Mode)
模式特点
- 默认模式:Hadoop 解压后无需任何配置即可运行单机模式;
- 无分布式组件:不启动 HDFS(NameNode、DataNode)和 YARN(ResourceManager),所有操作基于本地文件系统;
- 轻量高效:MapReduce 任务作为单进程的子线程执行,适合快速验证业务逻辑。
核心配置
无需修改任何配置文件,使用默认配置即可。Hadoop 单机模式默认使用:
- 本地文件系统(而非 HDFS);
local 模式运行 MapReduce(无 YARN 调度)。
实战示例:WordCount 词频统计
步骤 1:准备输入数据
1 2 3 4 5
| # 创建本地输入目录 mkdir -p wcinput # 写入测试数据 echo "hadoop yarn mapreduce" > wcinput/input.txt echo "hadoop hdfs" >> wcinput/input.txt
|
步骤 2:运行 WordCount 示例
Hadoop 自带示例 JAR 包(hadoop-mapreduce-examples-${version}.jar),直接运行词频统计任务:
1 2
| # 执行命令(需替换 JAR 包路径和版本) $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount wcinput wcoutput
|
步骤 3:查看结果
单机模式输出结果保存在本地目录 wcoutput:
1 2 3 4 5 6 7 8
| # 查看结果文件 cat wcoutput/part-r-00000
# 输出内容 hadoop 2 hdfs 1 mapreduce 1 yarn 1
|
伪分布式模式(Pseudo-Distributed Mode)
模式特点
- 单节点集群:在一台机器上启动所有 Hadoop 守护进程,模拟分布式环境;
- HDFS 与 YARN 启用:NameNode、DataNode、ResourceManager、NodeManager 均以守护进程形式运行;
- 本地环路通信:组件间通过
localhost 或本地 IP 通信,数据存储在本地磁盘但模拟分布式逻辑。
核心配置文件
需修改 4 个核心配置文件(位于 $HADOOP_HOME/etc/hadoop/):
(1)core-site.xml(Hadoop 核心配置)
1 2 3 4 5 6 7 8 9 10 11 12 13
| <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property>
<property> <name>hadoop.tmp.dir</name> <value>/opt/data/hadoop/tmp</value> </property> </configuration>
|
(2)hdfs-site.xml(HDFS 配置)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <configuration> <property> <name>dfs.replication</name> <value>1</value> </property>
<property> <name>dfs.namenode.name.dir</name> <value>/opt/data/hadoop/hdfs/name</value> </property>
<property> <name>dfs.datanode.data.dir</name> <value>/opt/data/hadoop/hdfs/data</value> </property>
<property> <name>dfs.permissions.enabled</name> <value>false</value> </property> </configuration>
|
(3)mapred-site.xml(MapReduce 配置)
1 2 3 4 5 6 7 8 9 10 11 12 13
| <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
<property> <name>mapreduce.application.classpath</name> <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value> </property> </configuration>
|
(4)yarn-site.xml(YARN 配置)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
<property> <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property>
<property> <name>yarn.nodemanager.env-whitelist</name> <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value> </property> </configuration>
|
启动伪分布式集群
步骤 1:格式化 HDFS(首次启动前执行)
1 2
| # 格式化 NameNode(仅需执行一次,多次执行会清空数据) $HADOOP_HOME/bin/hdfs namenode -format
|
注意:格式化会生成新的 namespaceID,若已启动过 DataNode,需删除 dfs.data.dir 目录后重新启动,否则 DataNode 因 ID 不匹配无法连接 NameNode。
步骤 2:启动 HDFS 守护进程
1 2
| # 启动 NameNode、DataNode、SecondaryNameNode $HADOOP_HOME/sbin/start-dfs.sh
|
步骤 3:启动 YARN 守护进程
1 2
| # 启动 ResourceManager、NodeManager $HADOOP_HOME/sbin/start-yarn.sh
|
步骤 4:验证进程启动
执行 jps 命令,确认以下进程均已启动:
1 2 3 4 5
| NameNode # HDFS 主节点 DataNode # HDFS 数据节点 SecondaryNameNode # HDFS 元数据备份节点 ResourceManager # YARN 资源管理器 NodeManager # YARN 节点管理器
|
访问 Web 监控界面
- HDFS Web UI:
http://localhost:9870(Hadoop 3.x 版本,2.x 为 50070);
- YARN Web UI:
http://localhost:8088。
实战示例:HDFS 与 YARN 上运行 WordCount
步骤 1:在 HDFS 中创建目录
1 2
| # 创建输入目录 $HADOOP_HOME/bin/hdfs dfs -mkdir -p /test/wordcount/input
|
步骤 2:上传本地文件到 HDFS
1
| $HADOOP_HOME/bin/hdfs dfs -put wcinput/input.txt /test/wordcount/input/
|
步骤 3:运行 MapReduce 任务
1
| $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount /test/wordcount/input /test/wordcount/output
|
步骤 4:查看结果
1 2
| # 查看 HDFS 中的输出文件 $HADOOP_HOME/bin/hdfs dfs -cat /test/wordcount/output/part-r-00000
|
关闭集群
1 2 3 4 5
| # 关闭 YARN $HADOOP_HOME/sbin/stop-yarn.sh
# 关闭 HDFS $HADOOP_HOME/sbin/stop-dfs.sh
|
完全分布式模式(Full-Distributed Mode)
模式特点
- 多节点集群:由至少 3 个节点组成(1 个主节点 + 2 个从节点);
- 组件分布式部署:HDFS 和 YARN 组件分散在不同节点,实现负载均衡;
- 生产级可用性:支持数据多副本存储、节点故障容错,适合大规模数据处理。
集群规划(3 节点示例)
| 节点 hostname |
角色(HDFS) |
角色(YARN) |
硬件建议 |
hadoop1 |
NameNode |
无 |
高内存(如 16GB) |
hadoop2 |
DataNode |
NodeManager |
高磁盘(如 1TB) |
hadoop3 |
DataNode |
ResourceManager + NodeManager |
高 CPU(如 8 核) |
前置准备
配置主机名与 IP 映射
在所有节点的 /etc/hosts 中添加:
1 2 3
| 192.168.1.101 hadoop1 192.168.1.102 hadoop2 192.168.1.103 hadoop3
|
配置 SSH 免密登录
主节点(hadoop1)需免密登录所有从节点:
1 2 3 4 5 6 7
| # 生成 SSH 密钥(主节点执行) ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
# 复制公钥到所有节点(包括自身) ssh-copy-id hadoop1 ssh-copy-id hadoop2 ssh-copy-id hadoop3
|
核心配置文件
core-site.xml(所有节点一致)
1 2 3 4 5 6 7 8 9 10 11 12 13
| <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop1:9000</value> </property>
<property> <name>hadoop.tmp.dir</name> <value>/opt/data/hadoop/tmp</value> </property> </configuration>
|
hdfs-site.xml(所有节点一致)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <configuration> <property> <name>dfs.replication</name> <value>2</value> </property>
<property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop2:9868</value> </property>
<property> <name>dfs.namenode.name.dir</name> <value>/opt/data/hadoop/hdfs/name</value> </property>
<property> <name>dfs.datanode.data.dir</name> <value>/opt/data/hadoop/hdfs/data</value> </property> </configuration>
|
mapred-site.xml(所有节点一致)
1 2 3 4 5 6 7
| <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
|
yarn-site.xml(所有节点一致)
1 2 3 4 5 6 7 8 9 10 11 12 13
| <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
<property> <name>yarn.resourcemanager.hostname</name> <value>hadoop3</value> </property> </configuration>
|
配置节点列表(workers 文件)
修改 $HADOOP_HOME/etc/hadoop/workers,列出所有 DataNode 节点:
分发配置文件到所有节点
1 2 3 4 5
| # 将配置文件复制到 hadoop2 scp -r $HADOOP_HOME/etc/hadoop/ hadoop2:$HADOOP_HOME/etc/
# 复制到 hadoop3 scp -r $HADOOP_HOME/etc/hadoop/ hadoop3:$HADOOP_HOME/etc/
|
启动完全分布式集群
步骤 1:格式化 HDFS(仅主节点 hadoop1 执行)
1
| $HADOOP_HOME/bin/hdfs namenode -format
|
步骤 2:启动 HDFS(主节点 hadoop1 执行)
1
| $HADOOP_HOME/sbin/start-dfs.sh
|
步骤 3:启动 YARN(ResourceManager 所在节点 hadoop3 执行)
1
| $HADOOP_HOME/sbin/start-yarn.sh
|
步骤 4:验证集群状态
- 在主节点
hadoop1 执行 jps,确认 NameNode 启动;
- 在从节点
hadoop2 执行 jps,确认 DataNode、SecondaryNameNode 启动;
- 在节点
hadoop3 执行 jps,确认 DataNode、ResourceManager、NodeManager 启动。
运行测试任务
与伪分布式模式类似,通过 HDFS 上传文件并运行 WordCount,验证集群功能正常。
三种模式核心差异对比
| 对比维度 |
单机模式 |
伪分布式模式 |
完全分布式模式 |
| 节点数量 |
1 节点(无分布式) |
1 节点(模拟分布式) |
3+ 节点(真实分布式) |
| 进程部署 |
无守护进程,单 JVM 运行 |
所有进程在单节点启动 |
进程分布式部署(主从分离) |
| 数据存储 |
本地文件系统 |
本地文件系统(模拟 HDFS) |
HDFS 分布式存储(多副本) |
| 资源隔离 |
无隔离,共享本地资源 |
进程级隔离,共享单节点资源 |
节点级隔离,资源分布式分配 |
| 适用场景 |
开发调试、单元测试 |
功能验证、小规模测试 |
生产环境、大规模数据处理 |
| 配置复杂度 |
无配置(默认启用) |
需配置 4 个核心文件 |
需配置网络、SSH、多节点协同 |