Apache Hadoop 是一个开源的分布式计算框架,它为在大型数据集上运行分布式应用程序提供了基础。Hadoop 的核心由 HDFS、MapReduce 和 YARN 三个组件构成,它们协同工作,共同构建了一个强大的分布式数据处理平台。本文将逐一详解这三大组件。
一、 HDFS (Hadoop Distributed File System) - 分布式存储
HDFS 是 Hadoop 的核心组件之一,它是一个分布式文件系统,专门为存储非常大的文件而设计,运行在通用的硬件集群上。HDFS 的架构是主从 (Master/Slave) 架构。
1.1 HDFS 的架构
HDFS 主要由以下几个组件构成:
NameNode (主节点):
管理文件系统的命名空间 (Namespace),即目录树结构。
记录每个文件和目录的元数据 (Metadata),包括文件名、文件属性、文件被分成多少个块 (Block)、每个块存储在哪些 DataNode 上。
不存储实际文件数据,只存储指向数据块的指针。
管理客户端对文件的访问。
单点故障 (Single Point of Failure, SPOF): 传统的 NameNode 是一个单点,NameNode 的失败将导致整个集群不可用。为了克服这个问题,Spark 引入了 High Availability (HA) 机制,如 Active/Standby NameNodes,并将元数据写入共享存储(如 ZooKeeper)。
DataNode (工作节点):
负责存储文件数据的实际数据块 (Data Blocks)。
根据 NameNode 的指令,执行数据的创建、删除、读写等操作。
定期向 NameNode 发送“心跳 (Heartbeat)”信号,报告其状态以及它所管理的数据块列表。
当 NameNode 检测到 DataNode 发生故障时,它会重新复制该 DataNode 上丢失的数据块到其他健康的 DataNode 上。
Secondary NameNode (可选,但在 HA 模式下功能由 NameNode HA 替代):
不参与到 Namenode 的故障转移中,它的主要职责是周期性地与 NameNode 协同,将 NameNode 的 EditLogs 合并到 FsImage 中,以防止 EditLogs 过大导致 NameNode 启动变慢。
在 HA 模式下,该角色通常由 Standby NameNode 承担。
1.2 HDFS 的核心设计理念
大数据存储: HDFS 适合存储 PB 级别的数据。
流式数据访问 (Streaming Access): HDFS 适合于通过一次写入、多次读取的方式访问数据,不适合随机读写。
容错性 (Fault Tolerance): 通过数据冗余(默认一个文件块复制 3 份)来保证数据的可靠性。当某个 DataNode 失败时,可以从复制的副本中读取数据。
大块 (Large Blocks): HDFS 将文件分割成大块(通常是 128MB 或 256MB),这样可以减少 NameNode 存储的元数据量,并降低寻址开销,适合存储大文件。
高吞吐量 (High Throughput): 优化了顺序读写性能,追求高吞吐量。
二、 MapReduce - 分布式计算模型
MapReduce 是 Hadoop 中用于处理海量数据的分布式计算框架。它将计算任务分解为两个主要阶段:Map 和 Reduce。
2.1 MapReduce 的工作流程
Input: MapReduce 作业接收来自 HDFS 的输入数据。
Map 阶段:
输入数据被分割成多个 InputSplit,每个 InputSplit 对应一个 Map 任务。
每个 Map 任务读取一个 InputSplit,并将输入数据(通常是键值对,如 <行偏移, 行文本>) 映射成一组中间键值对 (<Intermediate Key, Intermediate Value>)。
Map 任务将输出的中间键值对写入本地磁盘。
Shuffle 和 Sort (中间处理):
Map 任务的输出会经历一个“Shuffle”过程。每个 Map 任务的输出,根据中间键的相同,被分区 (Partition) 到不同的 Reduce 任务。
在每个 Reduce 任务的本地,这些中间键值对会被排序 (Sort),使得具有相同中间键的所有值都聚集在一起。
Reduce 阶段:
每个 Reduce 任务接收来自所有 Map 任务中属于该 Reduce 任务分区的所有中间键值对。
Reduce 任务对每个唯一的中间键,将其所有的中间值聚合并处理,输出最终的键值对 (<Output Key, Output Value>)。
Output: Reduce 任务的输出会被写回 HDFS。
2.2 MapReduce 的特点
分布式并行处理: 将大型计算分解成可并行执行的 Map 和 Reduce 任务。
容错性: 如果某个 Map 或 Reduce 任务失败,JobTracker (在 Hadoop 1.x 中) / ResourceManager (在 Hadoop 2.x 中) 会重新启动该任务。
编程模型简单: MapReduce 提供了一种相对简单的编程模型,开发者只需要关心 Map 和 Reduce 函数的实现。
批处理: MapReduce 主要用于批处理场景,不适合低延迟的实时计算。
数据移动开销: Shuffle 和 Sort 阶段需要大量的数据在节点间传输,这是 MapReduce 性能的一个瓶颈,尤其是在数据量巨大或网络带宽受限时。
三、 YARN (Yet Another Resource Negotiator) - 集群资源管理
YARN 是 Hadoop 2.x (Hadoop NextGen) 引入的核心组件,它将 Hadoop 的资源管理和作业调度功能从 MapReduce 中分离出来,成为了一个通用的分布式资源管理系统。YARN 的出现使得 Hadoop 不仅仅局限于 MapReduce,而是能够运行包括 Spark, Flink, Storm, Impala 等多种计算框架。
3.1 YARN 的架构
YARN 由以下几个关键组件构成:
ResourceManager (RM, 主节点):
YARN 集群的主计算资源管理器。
它接收来自客户端的作业提交请求。
负责全局的资源调度。
有一个 Scheduler (调度器) 组件,负责将集群的计算资源(CPU、内存等)分配给各个应用程序 (Application)。调度器有多种策略,如 FIFO、Capacity Scheduler、Fair Scheduler。
有一个 ApplicationsManager (AMS) 组件,负责接收应用程序的提交,并与 ApplicationMaster 交互。
NodeManager (NM, 工作节点):
运行在集群的每个节点(DataNode/NodeManager)上。
负责管理节点上的容器 (Container)。容器是 YARN 中的资源抽象,包含了 CPU、内存、磁盘等。
接收來自 ResourceManager 的指令,启动、监控和停止运行在自己节点上的 ApplicationMaster 和 Container。
向 ResourceManager 报告节点的状态和可用的资源。
ApplicationMaster (AM):
每个应用程序(如一个 MapReduce 作业、一个 Spark 应用)都会有一个独立的 ApplicationMaster。
它在 ResourceManager 的指导下,向 ResourceManager 申请资源(以 Container 的形式)。
一旦获取到资源(Container),它会与对应的 NodeManager 合作,在该 Container 中启动和管理应用程序的各个任务(如 MapReduce 的 Map/Reduce 任务,Spark 的 Executor)。
监控应用程序任务的执行状态,并在任务失败时进行重试。
Client (客户端):
用于提交作业到 YARN 集群的工具(如 spark-submit, hadoop jar ...)。
3.2 YARN 的工作流程(以 Spark 应用为例)
提交应用程序: Spark Driver (客户端) 调用 spark-submit,将 Spark 应用提交给 YARN 的 ResourceManager。
** ResourceManager 响应:** ResourceManager 接收到提交请求,通过 ApplicationsManager 启动一个 Spark ApplicationMaster (AM)。
** ApplicationMaster 申请资源:** Spark ApplicationMaster 启动后,开始向 ResourceManager 申请运行 Spark Executor 所需的 Container。它会说明需要多少 CPU、内存等资源。
** ResourceManager 分配资源:** ResourceManager 的 Scheduler 根据集群的资源情况和调度策略,将可用的 Container 分配给 Spark ApplicationMaster。
** ApplicationMaster 启动 Executor:** Spark ApplicationMaster 收到 Container 分配后,会指示对应的 NodeManager 在这些 Container 中启动 Spark Executor。
** Executor 执行任务:** Spark Executor 启动后,从 Spark Driver 获取任务(如 Spark RDD 的分区计算),并在自己所在的 Container 中执行。
** 状态汇报:** Executor 向 Spark Driver 报告任务状态,ApplicationMaster 则向 ResourceManager 汇报整个应用程序的执行状态。
** 应用程序完成:** 当所有 Spark Driver 和 Executor 完成工作后,ApplicationMaster 会向 ResourceManager 注册应用程序的完成,然后退出。
3.3 YARN 的优势
资源通用性: YARN 可以同时管理多种计算框架的资源,不再局限于 MapReduce。
资源隔离: 通过 Container 机制,为不同的应用程序提供独立的资源,避免相互干扰。
可扩展性: 易于扩展,可以支持更大规模的集群和更多的并发应用。
高可靠性: ResourceManager 也可以配置为 High Availability 模式。
更灵活的调度: 提供了多种调度器,可以满足不同的调度需求。
四、 Hadoop 的协同工作
HDFS 提供了一个可靠、可扩展的分布式存储层,用于存储海量的原始数据和 MapReduce/Spark 等计算框架的中间/输出结果。
MapReduce 是 Hadoop 早期提供的分布式计算模型,它遵循“计算靠近数据”的原则,在 HDFS 上执行数据分析任务。
YARN 作为 Hadoop 2.x 的核心,将资源管理和调度从 MapReduce 中分离出来,成为一个通用的分布式资源管理系统,充当了集群的“操作系统”,能够支持包括 MapReduce 在内的多种计算框架,极大地提升了 Hadoop 生态系统的灵活性和通用性。
这三个组件的有机结合,共同构成了 Hadoop 生态系统的基石,使得在大规模数据集上进行分布式计算成为可能。
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐