当前位置: 首页 > news >正文

深度解析 HDFS与Hive的关系

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路径)
HDFSHive 的数据底座,所有表数据都以文件形式存储于 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 计算引擎

特性HDFSHive
存储对象文件(Block)表(逻辑)
元数据内部内存 & FsImageMetastore(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 等引擎
ResourceManagerYARN分配执行任务所需的计算资源
HDFS存储层提供数据存储与读取支撑(通过 InputFormat)
Serde解析器文件内容序列化/反序列化(如 ORC、Parquet)
InputFormatIO 接口分片读取数据(行/列),对接底层存储格式

四、以 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)+------------+------------+|vDataNodes同时:+-----------------------------+|     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 EngineTez / 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)读取数据,执行 DAGSELECT 子查询后,写入 FileSink 到 HDFS
HDFSInputFormat 读取数据块输出数据写入临时目录,成功后 move 到目标目录
文件格式ORC/Parquet 支持谓词下推、列存压缩写入时可控制压缩格式、分区结构
安全控制可通过 Ranger/Sentry 实现表级、列级、行级权限控制插入/修改权限通过 Metastore + 授权服务进行验证

相关文章:

  • HarmonyOS NEXT~鸿蒙系统与mPaaS三方框架集成指南
  • 电商虚拟户:重构资金管理逻辑,解锁高效归集与智能分账新范式
  • 基于springboot3 VUE3 火车订票系统前后端分离项目适合新手学习的项目包含 智能客服 换乘算法
  • Qt调用librdkafka
  • Android 中拖拽从一个组件到另外一个组件的写法(跨容器拖拽)
  • 封装POD与PinMap文件总结学习-20250516
  • 【AS32X601驱动系列教程】MCU启动详解
  • java接口自动化初识
  • 在 Azure OpenAI 上使用 Elastic 优化支出和内容审核
  • OpenCV 图像色彩空间转换
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Rotating Navigation (旋转导航)
  • 在 Win 10 上,Tcl/Tk 脚本2个示例
  • ubuntu kubeasz 部署高可用k8s 集群
  • 电磁感应在量子计算中如何应用
  • day018-磁盘管理-案例
  • Babylon.js学习之路《六、材质与纹理:为模型赋予真实的表面效果》
  • 医疗影像中,DICOM点云、三角面片实体混合渲染(VR)
  • Oracle中如何解决FREE BUFFER WAITS
  • Oracle基础知识
  • Redis哨兵(Sentinel)模式详解:构建高可用Redis架构
  • 顶刊论文现“飙脏话辱骂第二作者”,期刊回应:正积极调查
  • 杭州3宗住宅用地收金42.49亿元,最高溢价率51.38%
  • 中疾控:适龄儿童要及时、全程接种百白破疫苗
  • 俄罗斯哈巴罗夫斯克市首次举办“俄中论坛”
  • 人民日报评论员观察:稳企业,全力以赴纾困解难
  • 达恩当选罗马尼亚总统