Hadoop 生态系统:HDFS, MapReduce, YARN 详解
·
| 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 生态系统的基石,使得在大规模数据集上进行分布式计算成为可能。 ![]() |
更多推荐



所有评论(0)