Hadoop 三件套:存、算、调度的分布式基石

59 阅读6分钟

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

中间件,我给它的定义就是为了实现某系业务功能依赖的软件,包括如下部分:

Web服务器

代理服务器

ZooKeeper

Kafka

RabbitMQ

Hadoop HDFS(本章节)

上个小节我们介绍消息队列软件,本章进入大数据章节,会涉及到多个软件。但是我们这里主要讲解的HDFS。

在云计算与人工智能尚未普及的 2006 年,一个名为 Hadoop 的开源项目悄然诞生。它以“分而治之”的朴素哲学,通过 HDFS(存)、MapReduce(算)、YARN(调度) 三大核心组件,首次实现了用廉价商用服务器集群处理 PB 级数据的可能。这“老三件套”不仅成为大数据时代的引擎,更奠定了现代分布式系统的设计范式。

HDFS —— 数据洪流的河床(存)

设计目标:廉价硬件的可靠存储
面对海量数据的存储需求,传统 NAS/SAN 系统在成本和扩展性上彻底失效。HDFS 的核心突破在于:
  1. 分块存储:将文件切割为固定大小块(默认 128MB),分散存储于不同节点。

  2. 多副本冗余:每个块自动复制 3 份(可配置),物理分散存放,容忍节点宕机。

  3. 移动计算而非数据:计算任务优先调度至存有数据的节点,减少网络传输。

架构精髓:元数据与数据的分离
  • NameNode:集群的“大脑”,单点管理文件系统树、块映射表等元数据(后期引入 HA 机制解决单点故障);

  • DataNode:数据真实存储节点,执行数据块的读写请求,定期向 NameNode 汇报块状态

MapReduce —— 批处理的里程碑(算)

MapReduce 将复杂计算抽象为两个函数:

  • Map 阶段: 读取输入数据,将其拆分为独立的片段,由多个 Map 任务并行处理,输出中间键值对 (key, value)

  • Reduce 阶段: 将 Map 阶段输出的中间键值对按 key 进行分组和排序(Shuffle & Sort),然后由多个 Reduce 任务并行处理,每个 Reduce 处理一个或多个 key 对应的所有 value,最终输出结果。

    伪代码示例

    def map(key, value): # 处理原始数据,输出中间键值对 emit(intermediate_key, value)
    def reduce(key, values_list): # 聚合相同 key 的值 emit(final_result)

YARN —— 资源管理的破壁者(调度)

  • ResourceManager (RM):Master节点。集群全局的资源管理和调度器。负责接收应用提交请求、调度资源、启动/监控 ApplicationMaster。

  • NodeManager (NM):Slave节点。单节点的资源管理和任务执行代理。负责启动、监控容器(Container),向 RM 报告资源使用和容器状态。

  • ApplicationMaster (AM):****每个应用一个实例。由 RM 启动,负责向 RM 协商应用所需的资源(Container),与 NM 通信启动/监控任务,管理单个应用的执行和容错。

其他相关软件

  1. Apache Hive
  • 角色: 基于 Hadoop 的数据仓库工具

  • 功能: 提供类似 SQL 的查询语言(HiveQL),将 SQL 查询自动转换为 MapReduce、Tez 或 Spark 作业在 Hadoop 上执行。让熟悉 SQL 的用户也能处理 HDFS 上的大数据。

  • 核心概念: 表(Table)、分区(Partition)、分桶(Bucket)、元数据存储(通常用 MySQL/PostgreSQL)。

  1. Apache Pig
  • 角色: 用于分析大型数据集的高级数据流语言和执行框架。

  • 功能: 提供 Pig Latin 脚本语言,描述数据转换流程(ETL - Extract, Transform, Load)。脚本被编译成 MapReduce 作业序列执行。相比直接写 MapReduce 代码更简洁。

  1. Apache HBase
  • 角色: 运行在 HDFS 之上的分布式、可扩展的 NoSQL 数据库

  • 功能: 提供对海量数据的实时随机读写访问(弥补 HDFS 的不足)。数据按行键(Row Key)排序存储。适用于需要低延迟访问大表的场景(如消息、用户画像)。

  • 模型: 列式存储(Column Family)、强一致性(特定级别)。

  1. Apache Spark
  • 角色: 快速、通用的分布式计算引擎。虽然独立于 Hadoop,但常与 Hadoop (HDFS, YARN) 集成使用

  • 核心优势: 内存计算(大幅减少磁盘 I/O)、DAG 执行引擎(更高效的任务调度)、丰富的 API(Scala, Java, Python, R)、支持多种工作负载(批处理 Spark SQL, 流处理 Spark Streaming / Structured Streaming, 机器学习 MLlib, 图计算 GraphX)。

  • 与 MapReduce 比较: 通常比 MapReduce 快很多倍,尤其在迭代算法和交互式查询场景。

  1. Apache ZooKeeper
  • 角色: 分布式协调服务

  • 功能: 为分布式应用提供配置维护、命名服务、分布式同步(锁)、组服务、Leader 选举等。是保证 Hadoop 高可用性(HA)的基础(如 HDFS HA 的 Active/Standby NameNode 切换依赖 ZK)。

  1. Apache Sqoop
  • 角色: 用于在 Hadoop (HDFS/Hive/HBase) 和关系型数据库 (RDBMS) 之间高效传输批量数据的工具。

  • 功能: 导入(RDBMS -> Hadoop)、导出(Hadoop -> RDBMS)。

  1. Apache Flume
  • 角色: 高可靠、高可用的分布式海量日志采集、聚合和传输系统

  • 功能: 将来自不同来源(Web Server, Application Server)的流式日志数据高效地收集、聚合并传输到 HDFS 或 HBase 等集中存储中。

  1. Apache Oozie
  • 角色: 工作流调度系统

  • 功能: 管理和协调运行在 Hadoop 平台上的复杂作业依赖关系(多个 MapReduce, Pig, Hive, Sqoop, Spark 等作业按顺序或条件执行)。可以定时或事件触发。

  1. Apache Kafka
  • 角色: 分布式流处理平台独立但常与 Hadoop/Spark 集成

  • 功能: 高吞吐、低延迟、可持久化的发布-订阅消息系统。常用于构建实时数据管道和流式应用(如将实时数据喂给 Spark Streaming/Flink 或 Flume 写入 HDFS)。

  1. Apache Tez
  • 角色: 构建在 YARN 之上的通用数据流处理框架

  • 功能: 优化执行由复杂任务 DAG(有向无环图)构成的计算。Hive 和 Pig 可以将查询编译成 Tez 作业而非 MapReduce 作业,显著提升执行效率。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。