0%

三种运行模式

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>  
<!-- 指定 HDFS 的 NameNode 地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>

<!-- Hadoop 临时文件存储目录(需手动创建) -->
<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>  
<!-- 副本数量(单节点集群设为 1) -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>

<!-- NameNode 元数据存储目录(需手动创建) -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/data/hadoop/hdfs/name</value>
</property>

<!-- DataNode 数据存储目录(需手动创建) -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/data/hadoop/hdfs/data</value>
</property>

<!-- 关闭 HDFS 权限检查(方便测试) -->
<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>  
<!-- 指定 MapReduce 运行在 YARN 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

<!-- MapReduce 应用类路径(3.x 版本需配置) -->
<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>  
<!-- 启用 Shuffle 服务(MapReduce 依赖) -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- Shuffle 服务类(3.x 版本需配置) -->
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>

<!-- 允许环境变量白名单(避免 YARN 启动报错) -->
<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 UIhttp://localhost:9870(Hadoop 3.x 版本,2.x 为 50070);
  • YARN Web UIhttp://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>  
<!-- 指定 NameNode 地址(主节点 hostname) -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:9000</value>
</property>

<!-- Hadoop 临时目录(所有节点需手动创建) -->
<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>  
<!-- 副本数量(建议设为 2-3,取决于从节点数) -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>

<!-- SecondaryNameNode 地址(建议部署在从节点) -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop2:9868</value>
</property>

<!-- NameNode 元数据存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/data/hadoop/hdfs/name</value>
</property>

<!-- DataNode 数据存储目录 -->
<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>  
<!-- 指定 MapReduce 运行在 YARN 上 -->
<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>  
<!-- 启用 Shuffle 服务 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- 指定 ResourceManager 地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop3</value>
</property>
</configuration>
配置节点列表(workers 文件)

修改 $HADOOP_HOME/etc/hadoop/workers,列出所有 DataNode 节点:

1
2
hadoop2  
hadoop3

分发配置文件到所有节点

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,确认 DataNodeSecondaryNameNode 启动;
  • 在节点 hadoop3 执行 jps,确认 DataNodeResourceManagerNodeManager 启动。

运行测试任务

与伪分布式模式类似,通过 HDFS 上传文件并运行 WordCount,验证集群功能正常。

三种模式核心差异对比

对比维度 单机模式 伪分布式模式 完全分布式模式
节点数量 1 节点(无分布式) 1 节点(模拟分布式) 3+ 节点(真实分布式)
进程部署 无守护进程,单 JVM 运行 所有进程在单节点启动 进程分布式部署(主从分离)
数据存储 本地文件系统 本地文件系统(模拟 HDFS) HDFS 分布式存储(多副本)
资源隔离 无隔离,共享本地资源 进程级隔离,共享单节点资源 节点级隔离,资源分布式分配
适用场景 开发调试、单元测试 功能验证、小规模测试 生产环境、大规模数据处理
配置复杂度 无配置(默认启用) 需配置 4 个核心文件 需配置网络、SSH、多节点协同

欢迎关注我的其它发布渠道