Hadoop 生态系统:HDFS、YARN 与 MapReduce

FreeGuideOnline 最新 2026-06-17

Hadoop 生态系统核心组件详解:HDFS、YARN 与 MapReduce

Hadoop 是一个由 Apache 基金会开发的开源框架,用于在普通硬件集群上分布式处理大规模数据集。它的设计理念是“将计算移动到数据所在处”,从而突破单机性能与存储的瓶颈。本教程将深入介绍 Hadoop 生态系统的三个基石:HDFS(分布式文件系统)、YARN(资源管理器)和 MapReduce(计算引擎),帮助你理解它们如何协同工作。

HDFS:分布式文件系统

HDFS(Hadoop Distributed File System)是一种设计用于在廉价机器上高容错地存储大量数据的文件系统。它模仿 Google 的 GFS 实现,采用主/从架构,并提供高吞吐量的数据访问,非常适合超大文件的批处理场景。

HDFS 核心设计理念

  • 一次写入,多次读取:数据一旦写入并关闭后,修改操作仅限于追加,简化一致性模型,提升读取效率。
  • 移动计算比移动数据更划算:应用程序被调度到数据所在的节点上运行,避免大量数据在网络上传输。
  • 高容错性:通过数据块副本(默认3份)自动恢复故障节点上的数据。
  • 硬件异构性适应:能自动处理节点故障,不要求节点同构。

HDFS 架构组件

HDFS 采用主/从结构,主要由 NameNodeDataNode 两类守护进程组成。

NameNode(元数据管理节点)

  • 保存整个文件系统的命名空间(目录树、文件权限等)。
  • 维护文件到数据块(默认块大小128MB)的映射表,以及每个数据块存储在哪几个 DataNode 上。
  • 所有元数据存储在内存中,并定期将改动写入磁盘镜像文件(Fimage)和编辑日志(EditLog)。
  • 集群中只有一个处于活跃状态的 NameNode(高可用模式可配置多个)。

DataNode(数据存储节点)

  • 每个从节点上运行一个 DataNode 进程,负责将数据块实际存储在本地磁盘。
  • 响应客户端读写请求,并定期向 NameNode 发送心跳报告所持有数据块的健康状态。
  • 接收 NameNode 指令,如复制数据块到其他节点、删除无效块等。

辅助服务

  • Secondary NameNode:并非 NameNode 的热备份,而是定期合并编辑日志和镜像文件,防止编辑日志过大,并帮助恢复元数据。
  • Rack Awareness(机架感知):HDFS 可配置机架拓扑信息,使副本分布在不同机架上,以提高可靠性。

HDFS 读写流程简述

  • 写操作:客户端向 NameNode 请求创建文件,获得数据块存放的 DataNode 列表(管道)。客户端将数据以数据包流的形式写入第一个 DataNode,再由它复制到下一个 DataNode,形成管道复制。
  • 读操作:客户端向 NameNode 查询文件的数据块位置,然后按照距离优先级从对应的 DataNode 并行读取数据。

HDFS 的适用与局限

  • 适用场景:大文件(GB~TB 级)的顺序读写、批处理、流式数据访问。
  • 不适用场景:海量小文件(元数据压力大)、低延迟实时访问、频繁修改文件的场景。

YARN:通用资源管理系统

YARN(Yet Another Resource Negotiator)是 Hadoop 2.0 引入的资源管理平台,它彻底分离了计算引擎和资源管理,使得 Hadoop 集群能够同时运行 MapReduce、Spark、Flink 等多种计算框架。

YARN 的核心思想

传统 MapReduce v1 中的 JobTracker 同时负责资源管理和任务调度,成为系统瓶颈。YARN 拆分为全局的 ResourceManager 和针对每个应用的 ApplicationMaster,使资源分配更灵活,提高了集群利用率和可扩展性。

YARN 架构组件

ResourceManager(RM,资源管理器)

  • 整个集群的全局资源调度器,管理所有节点的资源总量。
  • 包含两个核心组件:调度器(Scheduler)应用管理器(ApplicationsManager)
  • 调度器根据容量、公平等策略分配资源,但不监控应用状态或进行故障处理。
  • 应用管理器负责接受客户端提交的应用,协商启动第一个 ApplicationMaster 容器,并在失败时重新运行。

NodeManager(NM,节点管理器)

  • 在每个从节点上运行的代理,监控本机资源(CPU、内存等),并定期向 RM 汇报。
  • 接收 RM 指令,启动和管理应用所需的容器(Container)。
  • 负责管理容器的生命周期、日志收集等。

ApplicationMaster(AM,应用管理器)

  • 每个应用都有一个专属的 AM 进程,运行在集群内某个容器中。
  • 应用启动时 AM 向 RM 申请资源容器,并与 NM 通信启动容器中执行的任务。
  • 负责执行中的任务监控与故障恢复。

Container(容器)

  • 对资源的抽象封装,包含 CPU 核心数、内存大小等。
  • 应用程序的所有代码都在容器中运行,AM 自身也运行在容器中。

YARN 工作流程示例

  1. 客户端提交应用(如 MapReduce Job)到 RM。
  2. RM 为应用分配一个容器并在其中启动 AM。
  3. AM 根据应用需求向 RM 申请更多容器资源。
  4. RM 结合调度器返回可用节点的容器列表。
  5. AM 请求对应 NM 启动容器,并着手执行具体任务。
  6. 任务运行完毕后,AM 向 RM 注销并释放资源。

YARN 的优势

  • 可扩展性:每个应用有独立的 AM,不会成为单点瓶颈。
  • 资源利用效率:支持多种计算框架共享集群,资源可动态分配。
  • 多种调度器:支持 FIFO、Capacity Scheduler、Fair Scheduler 等满足不同组织需求。

MapReduce:经典分布式计算模型

MapReduce 是一种面向大规模数据并行处理的编程模型和软件框架。它将计算过程抽象为两个阶段:Map(映射)和 Reduce(归约),开发者只需实现这两个函数即可实现分布式计算,框架负责数据切分、并行执行、任务调度和容错等复杂工作。

MapReduce 编程模型

  • Map 阶段:输入数据被切分成一个个分片,由多个 Mapper 任务并行处理,输出一系列中间键值对。
  • Shuffle 与排序:框架自动将 Map 输出的中间结果按 key 进行分区、排序和合并,再通过网络传输到合适的 Reducer 节点。
  • Reduce 阶段:Reducer 接收同一 key 的所有 value 列表,经过归并处理生成最终结果。

MapReduce v2 执行流程(基于 YARN)

  1. 客户端提交 Job 的配置和 Jar 包到 YARN 的 RM。
  2. RM 为 Job 启动一个 MRAppMaster(即 AM)。
  3. MRAppMaster 确定 Map 任务的数量(取决于输入分片),向 RM 申请容器启动 Map 任务。
  4. Map 任务读取其负责的数据分片(通常数据在本地或同机架节点),执行 map() 函数,将中间输出写入本地磁盘。
  5. 当 Map 任务完成比例达到阈值,MRAppMaster 开始向 RM 申请 Reduce 容器。
  6. Reduce 任务从各个 Map 任务所在节点拉取属于自己分区的中间数据,进行排序和合并,然后执行 reduce() 函数,将结果写入 HDFS。

核心组件与优化

  • InputFormat 与 OutputFormat:定义输入数据的读取方式和输出格式,如 TextInputFormat、SequenceFileInputFormat 等。
  • Partitioner:决定 Map 输出的每条记录应该送到哪个 Reduce 任务,默认为 HashPartitioner。
  • Combiner:可选的本地 Reduce 操作,运行在 Mapper 节点,在数据被发送到 Reducer 之前提前进行部分聚合,减少网络传输量。
  • 压缩:对中间结果和最终结果使用压缩(如 Snappy、Gzip),可显著提升性能。

MapReduce 的优缺点

  • 优点:简单易用、容错性强、可处理 PB 级数据、与 HDFS 紧密集成。
  • 局限性:编程模型不够灵活(Map-Reduce 链复杂时难表达),启动开销大(磁盘 I/O 密集),不适合实时计算或迭代算法。这些不足促使了 Spark 等更先进引擎的诞生。

三者协作:从数据存储到计算完成

在 Hadoop 集群中,HDFS 提供可靠、分布式的数据存储;YARN 统一管理和调度集群资源;MapReduce 作为典型计算引擎,向 YARN 申请资源并利用 HDFS 上的数据执行并行计算任务。理解这三个组件的角色与交互方式,是掌握 Hadoop 生态系统的基础,也是使用更高层组件(如 Hive、Pig、Spark on YARN)的前提。

通过本教程,你已经系统了解了 HDFS、YARN 和 MapReduce 的架构及工作原理。建议动手搭建一个单机或小规模集群,实际操作数据读写和提交 MapReduce 任务,以加深理解。