深度解析 HDFS与Hive的关系

发布于:2025-05-21 ⋅ 阅读:(13) ⋅ 点赞:(0)

1. HDFS 和 Hive 如何协同

我们将从 HDFS(Hadoop Distributed File System) 的架构入手,深入剖析其核心组成、工作机制、内部流程与高可用机制。然后详细阐述 Hive 与 HDFS 的关系,从执行流程、元数据管理、文件读写、计算耦合等角度分析其融合方式。


一、HDFS 架构详细剖析

1.1 核心组件

组件 角色 说明
NameNode 主节点 负责元数据管理,包括目录树、文件与块映射(block mapping)、权限、块副本位置
DataNode 从节点 存储实际的数据块(block),周期性向 NameNode 发送心跳与块报告
Secondary NameNode 辅助节点 周期性合并 FsImage 和 EditLog,防止 EditLog 过大(非 HA)
JournalNode(HA) 日志节点 存储共享的 EditLog 日志,支持 NameNode 高可用
ZKFailoverController (ZKFC) HA 组件 监控 NameNode 状态,结合 Zookeeper 实现故障转移
Checkpoint Node / Backup Node 可选 增强型 Secondary NN 角色,用于元数据备份

1.2 数据存储机制

分块(Block)策略
  • 默认块大小:128MB 或 256MB(可配置)

  • 每个大文件被切分为多个块(Block),每块被写入多个 DataNode(副本)

副本机制
  • 默认副本数:3

  • Rack-aware 策略:优先写入本机 -> 同机架不同节点 -> 不同机架,提高可靠性和容灾能力


1.3 元数据管理

类型 存储位置 说明
FsImage 本地磁盘 当前一致性文件系统快照,定期合并
EditLog 本地磁盘 / JN 所有对 HDFS 的变更操作日志(追加式)
BlockMap 内存中 文件到 Block 的映射、Block 所在 DataNode 信息,仅 NameNode 内存维护

1.4 文件读写流程(核心细节)

写入流程:
  1. 客户端向 NameNode 请求创建文件

  2. NameNode 分配 Block 和副本 DataNode 列表

  3. 客户端以 pipeline 流方式依次写入 DataNode(链式写入:DN1→DN2→DN3)

  4. 写入完成后通知 NameNode 更新 Block 信息

  5. NameNode 写 EditLog,记录操作变更

读取流程:
  1. 客户端向 NameNode 请求文件 Block 列表

  2. NameNode 返回每个 Block 所在的 DataNode 列表(按拓扑距离排序)

  3. 客户端并行从多个 DataNode 拉取 Block 数据并拼接


1.5 容错机制

  • 心跳机制:每 3 秒 DataNode 向 NameNode 发送心跳(丢失超过 10 分钟视为宕机)

  • 块报告机制:每小时向 NameNode 汇报当前所有块列表

  • 副本自动修复:当副本数低于配置阈值,NameNode 自动触发复制操作

  • Block Scanner:DataNode 本地检测数据块是否损坏(定期进行校验)


1.6 高可用架构(HA)

方式:Active/Standby NameNode + JournalNode + Zookeeper
  • JournalNode 集群用于存储 EditLog

  • Zookeeper+ZKFC 实现故障自动切换(Active/Standby)

  • 客户端通过 ZK 获取当前 Active NameNode 地址


二、Hive 架构详细剖析与 HDFS 关系

2.1 Hive 核心架构

组件 功能
HiveServer2 提供 JDBC/ODBC 服务,接收客户端请求
Driver 解析 SQL、生成执行计划
Compiler 语法解析、逻辑计划生成、查询优化
Execution Engine 任务调度(MapReduce、Tez、Spark)
Metastore 元数据存储(表结构、分区、HDFS路径)
HDFS Hive 的数据底座,所有表数据都以文件形式存储于 HDFS
Catalog(可选) 集成 HMS / HiveCatalog(如 Flink/Spark)进行统一元数据管理

2.2 Hive 与 HDFS 的核心关系

维度 描述
数据存储层 Hive 表对应的实际数据存储在 HDFS 上,每个表/分区对应一个 HDFS 路径(如 /warehouse/db/table/part=...
文件格式 支持 TextFile、ORC、Parquet、Avro 等,可压缩、可列存
表分区/桶 Hive 分区表在 HDFS 中对应子目录;桶表对应多个文件(用于 map-side join 优化)
操作行为 所有 Hive 的 insert/overwrite/load/drop 操作均直接调用 HDFS API 执行文件操作
容错与高可用 依赖 HDFS 的高可用与副本机制保障数据安全

2.3 Hive 查询执行过程(以 HDFS 为底层)

示例:SELECT * FROM sales WHERE region = 'east';
  1. HiveServer2 接收请求

  2. Compiler 阶段

    • 解析 SQL

    • 调用 Metastore 查询 sales 表的 HDFS 路径及分区信息

  3. 优化器阶段

    • 基于字段过滤裁剪 HDFS 目录(分区裁剪)

    • 选择执行引擎(MapReduce/Tez/Spark)

  4. 执行引擎阶段

    • 生成执行计划(如 MapReduce)

    • Mapper 任务并行拉取 HDFS 中的数据块进行处理

  5. 任务完成,结果返回用户


三、Hive 与 HDFS 深度耦合分析

层面 耦合内容 说明
路径映射 每个 Hive 表、分区都有一个 HDFS 目录路径,且通过 LOCATION 指定
Schema + Data 分离 Hive 元数据由 Metastore 管理,数据文件由 HDFS 存储
执行模式 Hive SQL 实际执行中,底层由任务读取 HDFS 文件,处理后输出到目标 HDFS 路径
数据一致性 元数据与实际 HDFS 数据需保持一致,需防止“元数据存在但文件丢失”等问题
数据落地 Hive 表插入或导入数据实质是写入 HDFS 目录下的文件
权限管理 HDFS 文件权限控制直接影响 Hive 表操作权限(如 HDFS ACL、Ranger)

四、总结:Hive 架构是构建在 HDFS 数据湖上的 SQL 计算引擎

特性 HDFS Hive
存储对象 文件(Block) 表(逻辑)
元数据 内部内存 & FsImage Metastore(MySQL/Derby)
访问方式 Java API(HDFSClient) SQL
容错机制 Block 副本、NN HA 依赖 HDFS 容错
执行模式 存储为主 执行为主(借助 MapReduce/Tez/Spark)

2. Hive 执行 SQL 的全过程解析

我们将对 Hive 执行 SQL 的全过程进行全链路、逐层解剖式分析,涵盖从用户发起查询、各组件执行职责,到最终数据返回的所有核心流程与内部机制。


一、Hive 执行 SQL 的整体流程概览

Client
  ↓
HiveServer2
  ↓
Driver
  ↓
Compiler
  ↓
Optimizer
  ↓
Execution Engine
  ↓
YARN / Local / LLAP
  ↓
HDFS + Metastore
  ↓
返回结果给用户

二、全链路详细步骤与组件职责分析

步骤 1:用户提交 SQL 请求

参与组件
  • CLI / Beeline / JDBC / ODBC 客户端

  • HiveServer2(HS2)

行为
  • 客户端通过 JDBC/ODBC 连接 HiveServer2,发送 SQL 请求

  • HiveServer2 接收并认证(可接入 LDAP、Kerberos、Ranger 等)


步骤 2:SQL 解析与执行初始化

参与组件
  • Driver(org.apache.hive.ql.Driver)

  • SessionManager / Context

行为
  • 创建执行会话(Session)

  • 初始化执行上下文(设置当前数据库、资源路径、执行配置等)

  • 封装查询成 QueryPlan


步骤 3:SQL 编译

参与组件
  • Compiler(org.apache.hive.ql.parse.ParseDriver)

  • SemanticAnalyzer

  • MetastoreClient

行为
  1. 词法与语法解析

    • 将 SQL 字符串转为 AST(抽象语法树)

  2. 语义分析

    • 解析表名、字段、函数、分区等

    • 查询 Metastore,获取表结构与分区路径信息(如 HDFS 目录)

    • 校验字段类型、函数合法性

  3. 逻辑计划生成

    • 构建 Operator Tree(如 TableScan → Filter → Join → Select → FileSink)


步骤 4:查询优化

参与组件
  • Optimizer(Logical Plan Optimizer)

  • Rule Dispatcher / Transformation Rules

行为
  • 谓词下推(Predicate Pushdown)

  • 列裁剪(Column Pruning)

  • MapJoin 转换

  • Join 排序优化(Cost-Based Optimizer)

  • 表分区裁剪(Partition Pruning)

  • Bucket Map Join、Skew Join 优化

Hive 优化器会尝试将逻辑计划转换为最小代价的执行路径,提升并发性与计算效率。


步骤 5:物理计划生成

参与组件
  • Physical Plan Generator

  • Execution Engine

行为
  • 将逻辑操作树转换为物理执行计划(如 MR DAG、Tez DAG 或 Spark Plan)

  • 根据引擎类型(默认 Tez / 可选 Spark、MR)生成相应任务计划


步骤 6:任务提交与资源调度

参与组件
  • Execution Engine

  • YARN ResourceManager / LLAP Daemon

  • JobTracker / TezApplicationMaster / SparkDriver

行为
  • 向 YARN 请求资源容器(Container)

  • 提交 MapReduce Job / Tez DAG / Spark Application

  • 启动 ApplicationMaster(AM)进行任务调度

  • 并行在多个 NodeManager 上启动 Task(如 Map、Reducer)


步骤 7:数据读取与处理

参与组件
  • HDFS Client

  • InputFormat / RecordReader

  • Mapper/Executor

  • Serde

行为
  • 使用 InputFormat/RecordReader 从 HDFS 读取文件数据(按切分 Block)

  • 通过 SerDe 反序列化为行记录

  • Mapper 执行 TableScan → Filter → Project 等操作

  • 根据 Plan 决定是否执行 Shuffle、Join、Aggregation 等操作


步骤 8:结果写入/输出

目标类型
  • SELECT 查询:直接返回结果(Memory / JDBC fetch)

  • INSERT/OVERWRITE:写入到目标 HDFS 路径

  • CREATE TABLE AS SELECT:创建表元数据 + 写入数据文件

组件行为
  • OutputFormat + RecordWriter 将结果写入本地/tmp/HDFS

  • 最终结果缓存在 HiveServer2 端(或可配置写入 result_tmp_path)


步骤 9:返回结果给用户

组件
  • HiveServer2

  • JDBC/ODBC 客户端

行为
  • HiveServer2 逐行读取结果缓冲区

  • 以 RowSet 形式通过 JDBC/ODBC 流式返回结果给用户


三、组件职责一览表(核心组件全解)

组件 所属模块 职责
HiveServer2 服务层 接收 SQL 请求,建立 session,结果返回
Driver 执行器 管理查询生命周期,协调编译、优化、执行
Compiler 编译器 SQL 解析为逻辑计划(AST → Operator Tree)
SemanticAnalyzer 分析器 语义分析,调用 Metastore 获取表结构
Metastore 元数据 存储表结构、分区、列信息(使用 MySQL 等)
Optimizer 优化器 进行各种规则优化(谓词下推、Join 优化等)
Execution Engine 执行层 将物理计划提交到 Tez/Spark/MR 等引擎
ResourceManager YARN 分配执行任务所需的计算资源
HDFS 存储层 提供数据存储与读取支撑(通过 InputFormat)
Serde 解析器 文件内容序列化/反序列化(如 ORC、Parquet)
InputFormat IO 接口 分片读取数据(行/列),对接底层存储格式

四、以 Tez 引擎为例:DAG 执行链路

Hive SQL
 ↓
逻辑计划(Operator Tree)
 ↓
Tez DAG Plan
 ↓
YARN ResourceManager 启动 AM
 ↓
Tez AM 启动多个 Vertex(类似 Map/Reduce)
 ↓
Vertex 拉取 HDFS 分片数据,运行 Operator
 ↓
结果通过 DAG 边传递(管道式执行)
 ↓
写入结果目录 / 返回查询结果

五、完整案例流程(SELECT 查询)

SELECT name, price FROM sales WHERE region = 'east' AND price > 100;

执行链路概览:

步骤 说明
SQL 输入 客户端通过 JDBC 向 HS2 提交查询
元数据解析 Hive 获取 sales 表的 HDFS 路径、列定义、分区
语义分析 AST → Operator Tree(TableScan → Filter → Project)
分区裁剪 region = 'east',裁剪对应 HDFS 子目录
优化 只读取 name, price 列,进行列裁剪与谓词下推
计划生成 构建 Tez DAG,使用 Tez AM 执行任务
数据读取 InputFormat 读取 ORC 文件中的列数据块
数据处理 任务执行 Filter(price > 100)、Project(取 name 和 price)
返回结果 Tez 写入临时结果 → HiveServer2 → JDBC 返回用户

六、总结:Hive SQL 执行是“编译型 SQL + 分布式任务”的复合流程

阶段 类型 特征
编译阶段 类似数据库编译器 语法 → 语义 → 优化 → 物理计划
执行阶段 类似大数据任务 Tez/Spark/MR 执行 DAG,有效并行计算
元数据阶段 类似数据库 Catalog 所有数据路径均依赖 Metastore
存储访问 基于 HDFS 高吞吐并行读写、Schema-on-Read

3. HiveQL 执行案例分

我们将从查询和修改两类操作出发,深入到系统架构层,逐层剖析涉及的流程与组件协作。


一、整体系统架构图(用户请求路径)

           +-----------------+
           |   JDBC/Beeline  |
           +--------+--------+
                    |
                    v
         +----------+----------+
         |      HiveServer2     |  ← JDBC 接入点(支持查询/修改/授权)
         +----------+----------+
                    |
       +------------+------------+
       |      Hive Compiler      |  ← 编译器:语法解析、逻辑优化、物理计划生成
       +------------+------------+
                    |
                    v
           +--------+--------+
           |  Execution Engine  | ← Tez / MapReduce / Spark
           +--------+--------+
                    |
       +------------+------------+
       |           HDFS           | ← 存储层,读写数据文件(ORC/Parquet/Text)
       +------------+------------+
                    |
                    v
               DataNodes

同时:
       +-----------------------------+
       |     Hive Metastore (MySQL) |
       +-----------------------------+
         ↑       ↑       ↑
      表结构   分区信息  数据位置


二、用户执行查询请求时(SELECT)

Step-by-step:

1. 客户端请求

  • 用户通过 JDBC/Beeline/Web 发送 SQL,如:

    SELECT name FROM user_logs WHERE region = 'US' LIMIT 10;
    

2. HiveServer2 接收请求

  • 检查 SQL 合法性

  • 连接到 Hive Metastore 查询 表 schema 和元数据(包括字段、分区、存储位置)

  • 获取执行引擎上下文(Tez / Spark / MapReduce)

3. Hive 编译器处理

  • 语法解析(Parse):生成 AST(抽象语法树)

  • 语义分析(Semantic Analysis):识别表、列、类型,绑定元数据

  • 逻辑计划生成(Logical Plan)

  • 优化(Rule-Based Optimizer)

    • 投影下推

    • 分区裁剪(partition pruning)

    • 谓词下推(predicate pushdown)

    • Join Reorder

  • 物理计划生成(Physical Plan):转为 Task DAG

4. 执行引擎提交任务

  • Hive 调用 Tez / Spark / MapReduce 提交作业

  • 向 YARN 注册任务,分配 Container 资源

  • 各个 Task 从 HDFS 读取 ORC/Parquet 数据,执行 map/filter/join 等操作

  • 数据通过 shuffle / reduce 汇总结果

5. 读取数据(HDFS 层)

  • 根据 Metastore 提供的数据路径,从 DataNode 拉取数据块

  • 通过 InputFormat(如 OrcInputFormat)进行列式读取

  • 每个 Task 处理一部分 Split

6. 汇总结果,返回给客户端

  • Task 执行完毕后,将结果写回 HiveServer2

  • JDBC 返回结果集给用户


SELECT 查询关键组件协作:

组件 作用
HiveServer2 接收 JDBC 请求、调度引擎
Metastore 提供表结构、分区信息、文件位置
Execution Engine Tez / Spark / MapReduce,执行 SQL 转换后的 DAG
HDFS 提供数据文件存储,分布式读取
ORC/Parquet 提供高效的列式存储和压缩,支持 predicate pushdown

三、用户执行修改请求时(INSERT/DELETE/UPDATE)

修改数据在 Hive 中也称为写入路径。以 INSERT INTO 为例。

Step-by-step:

1. 客户端发送写入请求

INSERT INTO user_logs SELECT * FROM staging_logs WHERE date = '2024-12-01';

2. HiveServer2 接收并验证

  • 检查权限

  • 获取源表和目标表的 schema、位置、格式

  • 解析写入是否是覆盖 / 追加 / 动态分区等

3. 编译优化逻辑计划

  • 生成 insert DAG

  • 判断是否需要 Bucketing / Sort / Partition

  • 动态分区裁剪、FileSink 插入节点确定路径

4. 调度执行引擎写入

  • 提交 Tez/Spark/MapReduce DAG

  • 执行 SELECT 子查询(从 staging_logs 读取)

  • 将输出写入 HDFS 的临时 staging 目录

5. HDFS 写入逻辑

  • 将结果数据写入 /warehouse/user_logs/.hive-staging-xxxxxx/

  • 写入过程可能压缩为 ORC/Parquet

  • 任务成功后重命名为目标目录(原子操作)

6. 更新 Metastore

  • 更新分区元数据(如果涉及分区表)

  • 增加文件列表、修改数据路径

  • 记录插入行为(用于 ACID 表则记录 delta)


Hive 写入相关细节:

操作类型 默认行为 引擎处理
INSERT INTO 追加模式,写入新数据文件 FileSink -> OutputFormat -> HDFS
INSERT OVERWRITE 清空原分区后再写 会删除老文件再写新文件
UPDATE/DELETE 需要 ACID 表,底层写 delta log 文件 _delta_0001_0002 等目录
事务支持 需要开启 hive.txn.manager 事务配置 支持 snapshot isolation

四、特殊路径分析(JOIN 查询)

JOIN 会产生:

  • 多阶段 MapReduce/Tez DAG

  • Join 类型判断(MapJoin / SortMergeJoin)

  • Hive 优化器会决定是否广播小表

SELECT u.id, u.name, o.total
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.date = '2024-12-01';

执行过程关键点

  • 小表 users 可能被广播为 MapJoin

  • 大表 orders 会被 scan + filter + hash join

  • Join 结果在 Reducer 合并输出


五、总结:Hive 查询/修改路径关键协作流程

层级 查询(SELECT) 写入/修改(INSERT/UPDATE)
客户端 JDBC/Beeline/Web SQL 提交 同上
HiveServer2 验证 SQL,连接 Metastore,解析语义 同上
Metastore 提供表结构、分区、数据路径 插入后更新元数据
编译器 生成 Logical Plan,优化,转为 Physical Plan 生成 DAG,规划写路径、压缩格式、分区路径等
引擎(Tez) 读取数据,执行 DAG SELECT 子查询后,写入 FileSink 到 HDFS
HDFS InputFormat 读取数据块 输出数据写入临时目录,成功后 move 到目标目录
文件格式 ORC/Parquet 支持谓词下推、列存压缩 写入时可控制压缩格式、分区结构
安全控制 可通过 Ranger/Sentry 实现表级、列级、行级权限控制 插入/修改权限通过 Metastore + 授权服务进行验证

网站公告

今日签到

点亮在社区的每一天
去签到