ZhangZhihui's Blog  

在 Hadoop 生态系统中,YARNMapReduce/Tez/Spark 的关系可以用一个经典的比喻来理解:YARN 是“操作系统(资源管家)”,而 MapReduce、Tez 和 Spark 是“运行在系统上的应用程序(计算工具)”。

它们之间通过“资源申请-分配-任务执行”的逻辑紧密耦合。


1. 核心角色定义

  • YARN (Yet Another Resource Negotiator):它是 Hadoop 2.0 引入的资源管理层。它不关心你如何计算数据,只关心你的集群有多少 CPU(Virtual Cores)和内存(Memory),并负责把这些资源分给需要的人。

  • 计算引擎 (MR/Tez/Spark):它们是数据处理逻辑层。它们决定了数据如何被切分、如何排序、如何聚合。


2. 它们之间的互动关系

当你想运行一个计算任务(如 Spark 作业)时,流程如下:

  1. 提交申请:计算引擎向 YARN 的 ResourceManager (RM) 提交作业。

  2. 启动管家:YARN 在某个节点启动一个 ApplicationMaster (AM)。每种引擎都有自己的 AM(例如 Spark 有 SparkAM,MR 有 MRAppMaster)。

  3. 资源博弈:AM 向 YARN 申请具体的资源(Container)。例如:“我需要 10 个 4G 内存的容器”。

  4. 任务分发:一旦 YARN 分配了 Container,计算引擎就会在这些 Container 中启动自己的任务线程(如 Spark 的 Executor 或 MR 的 Task)。

  5. 数据计算:计算引擎在 YARN 给的“地盘”里完成实际的数据运算。


3. 三种计算引擎的区别与进化

虽然它们都跑在 YARN 上,但“利用资源”的方式大不相同:

计算引擎 交互特点 性能表现 设计逻辑
MapReduce 分步式。每一步计算都要落盘,再从 YARN 重新申请资源进行下一步。 慢(高延迟) 极高可靠性,适合超大规模离线批处理。
Tez DAG(有向无环图)。多个任务流水线化,减少了 YARN 资源的反复申请和中间数据落盘。 中/快 Hive 默认引擎,比 MR 快很多。
Spark 内存计算。一次申请资源后,尽可能将数据存在内存中进行迭代,不轻易释放 Container。 极快 现代大数据处理的主流,适合机器学习和复杂分析。

4. 为什么要这样设计?(解耦的好处)

在 Hadoop 1.0 时代,计算和资源管理是捆绑在一起的(只有 MapReduce)。引入 YARN 后实现了解耦

  • 多租户共享:同一个 Hadoop 集群,可以同时跑着 Spark 任务处理实时分析,又跑着 MapReduce 处理深夜的离线报表,而 YARN 确保它们不会因为抢内存而导致集群崩溃。

  • 灵活性:如果你发明了一个更厉害的引擎(比如 Flink),只要它符合 YARN 的接口规范,就可以直接跑在现有的 Hadoop 环境中,无需重构底层。


5. 如何查看 YARN 上的资源占用?

作为调优的一部分,你通常需要访问 YARN Web UI (默认端口 8088)。

  • 查看 Application Type:你会看到列出的任务类型是 MAPREDUCETEZ 还是 SPARK

  • 查看资源分配:如果一个 Spark 任务占用了 90% 的内存,其他的 Hive (Tez) 任务就会处于 ACCEPTED(等待)状态,直到 Spark 释放资源。

总结: YARN 是分蛋糕的人,MR/Tez/Spark 是吃蛋糕的人。YARN 保证了公平和秩序,而引擎决定了吃蛋糕的速度。

 

MapReduce/Tez/Spark这些计算引擎是Hadoop带的还是Hive带的?

 

简单直接的答案是:它们既不完全属于 Hadoop,也不属于 Hive,而是作为独立的组件存在,Hive 通过配置来“调用”它们。

如果把大数据处理比作一辆车:

  • Hadoop (HDFS) 是底盘和油箱(存数据)。

  • YARN 是调度系统(管资源)。

  • MapReduce / Tez / Spark 是不同的引擎(负责跑数)。

  • Hive驾驶室/方向盘(负责下指令)。


1. 归属权详解

MapReduce:Hadoop 的亲儿子

  • 归属: 它是 Hadoop 项目的核心组件之一(Hadoop = HDFS + YARN + MapReduce)。

  • 关系: Hive 最初就是为了让人们不用写复杂的 MapReduce Java 代码而发明的。它是 Hive 的第一个、也是最老的引擎。

Tez:Hadoop 生态的增强组件

  • 归属: 它是一个独立的 Apache 开源项目,但它是为了优化 MapReduce 的缺陷而生的。

  • 关系: Hive 目前官方推荐的默认引擎是 Tez。它比 MapReduce 快得多,因为它能把复杂的 SQL 变成一个连续的流程,而不是断断续续的步骤。

Spark:独立的高性能引擎

  • 归属: 这是一个完全独立的生态系统,不属于 Hadoop 家族。

  • 关系: Hive 可以配置为使用 Spark 作为底层的计算引擎(称为 Hive on Spark)。这需要你单独安装 Spark 集群,并把相关的 Jar 包塞给 Hive。


2. Hive 是如何“指挥”这些引擎的?

当你输入一句 SQL 时,Hive 内部会发生“身份转换”:

  1. 解析器:把 SQL 翻译成一种“逻辑计划”。

  2. 编译器:根据你设置的引擎(set hive.execution.engine=...),把计划翻译成特定语言:

    • 如果是 MapReduce,就翻译成一堆 Map 和 Reduce 任务。

    • 如果是 Tez,就翻译成一个 DAG(有向无环图)。

    • 如果是 Spark,就翻译成一系列 RDD 算子。

  3. 提交任务:Hive 把翻译好的任务扔给 YARN,由 YARN 分配服务器资源去执行。


3. 三者对比(为什么现在很少用 MapReduce?)

引擎 速度 资源消耗 现状
MapReduce (每一步都要写磁盘,IO 极高) 逐渐过时,仅用于超大规模离线备份任务。
Tez (中间结果在内存或缓存中) Hive 的主流默认选择
Spark 极快(完全基于内存计算) 高(吃内存) 现代数仓、机器学习的首选。

总结

  • MapReduce 是 Hadoop 仓库自带的。

  • TezSpark 是你需要额外安装/配置到 Hadoop 环境中的。

  • Hive 本身只是一个“翻译官”,它不生产引擎,它只是引擎的搬运工。

下一步建议:

如果你正在搭建环境,可以通过 set hive.execution.engine=tez; 来体验速度的飞跃。

 

posted on 2025-12-24 22:35  ZhangZhihuiAAA  阅读(2)  评论(0)    收藏  举报