一条hive sql到mr , yarn,hdfs整个过程

这是一个非常经典的面试题,也是理解 Hadoop 生态系统如何协同工作的核心。我们来详细拆解一下一条 Hive SQL 从提交到最终得到结果的完整过程。

整个过程可以概括为:Hive 将我们编写的 SQL 翻译成一个或多个 MapReduce 任务,然后提交给 YARN 这个集群资源调度器。YARN 会为这些任务分配计算资源(Container),任务在执行过程中,会从 HDFS 读取数据,并将最终结果写回 HDFS。

下图清晰地展示了这一核心流程的各个阶段:

阶段三: 分布式计算
Reduce Phase
Reduce Task计算
结果写回HDFS
Map Phase
读取HDFS数据
Map Task计算
Shuffle Phase
分区排序拷贝归并
阶段二: 提交到YARN
ApplicationMaster
管理任务生命周期
Client
获取Application ID
ResourceManager
分配首个Container
阶段一: Hive 驱动层
Compiler
编译为执行计划
SQL Parser
解析与抽象语法树AST
Semantic Analyzer
语义分析与查询块QB
Logic Plan Generator
生成逻辑执行计划
Optimizer
逻辑优化
Physical Plan Generator
生成物理执行计划
MAPRED/SPARK
Hive SQL 提交
最终结果输出至HDFS

阶段一:Hive 驱动层(SQL to MR)

当你执行一条 Hive SQL(如 SELECT dept, AVG(salary) FROM emp GROUP BY dept;)时,Hive 并不会直接交给 MR 执行,而是先进行一系列复杂的转换和优化。

  1. 解析与抽象语法树(AST)

    • SQL Parser:Hive 使用 Antlr 等解析器工具将 SQL 字符串解析成一个抽象语法树(AST)。AST 会捕获 SQL 的语法结构,比如哪些是查询(SELECT),哪些是来源(FROM),哪些是条件(WHERE)等。
  2. 语义分析与查询块(QB)

    • Semantic Analyzer:遍历 AST,进行语义检查。例如,检查表 emp 和列 dept, salary 是否存在,数据类型是否匹配。最终会将 AST 转换成一个查询块(Query Block, QB)。QB 是 Hive 逻辑执行计划的基本单位。一个复杂的 SQL 可能会被分解成多个 QB。
  3. 生成逻辑执行计划

    • Logic Plan Generator:将 QB 转换为一个运算符树(Operator Tree),这被称为逻辑执行计划。运算符包括 TableScanOperator(扫描表)、SelectOperator(选择字段)、FilterOperator(过滤条件)、GroupByOperator(分组)、ReduceSinkOperator(为 Reduce 阶段准备数据)等。此时的计划是逻辑层面的,不涉及具体执行引擎。
  4. 逻辑优化

    • Optimizer:Hive 会对逻辑执行计划进行一系列优化。例如:
      • 谓词下推(Predicate Pushdown):尽早执行 WHERE 过滤条件,减少后续处理的数据量。
      • 列裁剪(Column Pruning):只读取查询中需要的列,避免读取所有列。
      • Map端聚合:在 Map 端先做一次局部聚合,减少 Shuffle 的数据量。
  5. 生成物理执行计划

    • Physical Plan Generator:将优化后的逻辑执行计划转换为物理执行计划。这一步确定了执行引擎(如 MapReduce、Tez、Spark)。对于 MR,逻辑运算符会被翻译成具体的 MR 任务。例如,一个带有 GROUP BY 的查询通常会被翻译成一个 MapReduce 作业
  6. 编译与输出

    • Compiler:将物理执行计划最终编译成一个有向无环图(DAG) 形式的执行计划(比如一个 MapReduce 作业的 DAG),并序列化到文件中。

阶段二:提交到 YARN(资源调度)

Hive 客户端(CLI/Beeline/HiveServer2)准备好执行计划后,就会向 YARN 提交作业。

  1. 提交申请:Hive 客户端向 YARN 的 ResourceManager (RM) 提交一个应用程序(Application),申请运行一个 MapReduce 作业。
  2. 分配容器:RM 响应申请,分配一个第一个 Container(容器,即一定的计算资源,如 CPU、内存),并在这个 Container 上启动 ApplicationMaster (AM)AM 就是这个作业的“项目经理”,负责管理这个作业的整个生命周期。
  3. AM 初始化:AM 启动后,会向 RM 注册,然后解析 Hive 编译好的执行计划(DAG)。
  4. 申请资源:AM 根据执行计划中的 Map 和 Reduce 任务数量,向 RM 申请更多的 Containers 来运行这些任务。
  5. 启动任务:RM 根据集群资源情况,为 AM 分配所需的 Containers。AM 然后与这些 Container 所在的 NodeManager (NM) 通信,启动 MapTask 或 ReduceTask 进程。

阶段三:MapReduce 执行(分布式计算)

任务在 YARN 分配的 Container 中开始执行,整个过程就是标准的 MapReduce 流程。

  1. Map Phase (读取 HDFS + Map 计算)

    • 每个 MapTask 会根据输入切片(Input Split)信息,从 HDFS 上读取一小块数据(比如一个 Block)。
    • MapTask 调用 map() 函数处理每一条数据。在我们的例子中,它会输出 <dept, salary> 这样的键值对。
    • 处理完数据后,MapTask 的输出会在本地磁盘进行分区(Partitioning)(为不同的 ReduceTask 做准备)、排序(Sorting)合并(Combining,可选)
  2. Shuffle Phase (洗牌)

    • 这是 MapReduce 的“心脏”。各个 MapTask 完成后的输出,会根据 Key 的哈希值被拉取(Fetch)到不同的 ReduceTask 节点上。
    • 例如,所有 dept=IT 的键值对都会被送到同一个 ReduceTask 上。这个过程涉及大量的网络数据传输。
  3. Reduce Phase (Reduce 计算 + 写入 HDFS)

    • 每个 ReduceTask 会从多个 MapTask 那里拉取属于自己分区的数据,并对这些数据进行归并排序(Merge Sort)
    • 然后,ReduceTask 调用 reduce() 函数处理排序后的数据。在我们的例子中,它对同一个 dept 的所有 salary 求平均值,计算出 AVG(salary)
    • 最后,ReduceTask 将最终结果写入 HDFS 中指定的输出路径。

最终步骤:结果返回

  • 当所有的 MapTask 和 ReduceTask 都成功完成后,ApplicationMaster 会向 ResourceManager 报告作业成功。
  • Hive 客户端检测到作业成功后,会(如果需要的话)从 HDFS 的结果文件中将最终结果取回并展示给用户。对于大数据集,Hive 通常只是将 HDFS 上的路径返回给用户。

总结

步骤主要组件职责
1. SQL 解析与编译Hive将 SQL 翻译、优化成 MapReduce 执行计划
2. 资源调度与任务管理YARN分配资源,启动并监控 ApplicationMaster 和各个 Task
3. 数据存储与计算HDFS & MapReduceHDFS 提供数据存储;MapReduce 在集群节点上进行分布式计算

这个过程清晰地展示了 Hadoop 核心组件如何各司其职:Hive 负责“翻译”YARN 负责“调度和管家”MapReduce 负责“干活”,而 HDFS 负责“仓储”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值