Hive 架构
概述
Hive 把 SQL 翻译成分布式计算任务,让分析师用 SQL 操作 HDFS 上的海量数据。它不自己存数据、不算数据,而是"SQL 翻译官 + 元数据管理"。本文拆解 Hive 的组件结构与 SQL 执行链路,以及 Metastore 的三种部署模式。
一、Hive 的定位
| 问题 | 回答 |
|---|---|
| Hive 存数据吗 | 不存,数据在 HDFS/对象存储 |
| Hive 算数据吗 | 不算,翻译成 MapReduce/Tez/Spark 去算 |
| Hive 的价值 | SQL 化、元数据统一、表结构管理 |
一句话:Hive = 元数据(Metastore)+ SQL 翻译引擎。
二、核心组件
2.1 组件总览
┌────────────────────────────────────────────┐
│ Hive Server │
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌──────┐ │
│ │ Driver │ │Compiler │ │ Optimizer│ │Executor│ │
│ └────────┘ └────────┘ └────────┘ └──────┘ │
│ │ 元数据请求 │ 执行计划 │
│ ▼ ▼ │
│ ┌──────────┐ ┌─────────────┐ │
│ │ Metastore │ │ 执行引擎 │ │
│ │ (MySQL) │ │ MR/Tez/Spark│ │
│ └──────────┘ └─────────────┘ │
└────────────────────────────────────────────┘2.2 各组件职责
| 组件 | 职责 |
|---|---|
| Driver | 接收 SQL、调度各阶段、返回结果 |
| Compiler | SQL → AST → 逻辑计划 → 物理计划 |
| Optimizer | 基于规则的优化(RBO)与代价优化(CBO) |
| Executor | 把物理计划提交给执行引擎执行 |
| Metastore | 存储表/分区/列的元数据,独立成服务 |
2.3 会话与接口
| 接口 | 说明 |
|---|---|
| Hive CLI | 命令行交互,老接口 |
| Beeline | 基于 HiveServer2 的新命令行,支持 JDBC |
| JDBC/ODBC | 供 BI 工具与程序连接 |
| HiveServer2 | 服务端多会话,支持权限与并发控制 |
生产环境统一走 HiveServer2 + Beeline/JDBC,CLI 仅限调试。
三、SQL 执行链路
3.1 完整流程
SELECT ... FROM dws_user_daily WHERE dt='20260822'
│
1. Driver 解析 SQL
│
2. Compiler:SQL → AST(抽象语法树)
│
3. Compiler:AST → 逻辑计划(Logical Plan)
│ └─ 从 Metastore 取表结构、分区信息
│
4. Optimizer:逻辑计划优化
│ └─ 谓词下推、列裁剪、Join 重排(RBO/CBO)
│
5. Compiler:逻辑计划 → 物理计划(Task DAG)
│ └─ 拆成 Map Task / Reduce Task / Tez 顶点
│
6. Executor:提交给执行引擎(MR/Tez/Spark)
│
7. 引擎在 YARN 上运行,结果写回 HDFS / 返回客户端3.2 关键环节
| 环节 | 说明 |
|---|---|
| AST | 语法解析结果,校验 SQL 合法性 |
| 元数据解析 | 从 Metastore 加载表字段、分区,用于生成计划 |
| 逻辑计划 | 与引擎无关的算子树(Scan/Filter/Join/Aggregate) |
| 优化 | 谓词下推、列裁剪、分区裁剪、Join 顺序 |
| 物理计划 | 映射到具体引擎的 Task 与 Shuffle 结构 |
四、三种执行引擎
4.1 引擎对比
| 引擎 | 特点 | 适用 |
|---|---|---|
| MapReduce | 慢(每次写磁盘),最稳定 | 老集群兜底 |
| Tez | DAG 化,减少中间落盘,比 MR 快数倍 | Hive on Tez 默认 |
| Spark | 内存计算,最快,适合大作业 | Hive on Spark,依赖 Spark 集群 |
4.2 配置切换
xml
<property>
<name>hive.execution.engine</name>
<value>tez</value> <!-- mr / tez / spark -->
</property>4.3 HiveQL 与引擎的关系
同一个 SQL,不同引擎生成不同的物理计划:
| SQL 片段 | MR 表现 | Tez 表现 |
|---|---|---|
| 两表 Join | 一个 Join Job | DAG 内顶点,无需落地 |
| 多次聚合 | 多个 Job 串联 | 合并为单 DAG |
| Map 端聚合 | Combiner | 顶点内完成 |
选择建议:新集群默认 Tez;计算密集场景评估 Spark;MR 基本不用于新任务。
五、Metastore 详解
5.1 存储内容
| 元数据 | 说明 |
|---|---|
| 数据库/表 | 库表定义、所属库 |
| 字段与类型 | 列名、列类型、注释 |
| 分区信息 | 分区键、分区位置 |
| 表存储信息 | 文件格式、存储路径、SerDe |
| 权限信息 | 库/表授权(结合 Ranger) |
5.2 三种部署模式
| 模式 | 说明 | 特点 |
|---|---|---|
| 内嵌 Derby | Metastore 与客户端同进程 | 仅单机测试 |
| 本地 MySQL | Metastore 服务与 Hive 同机 | 小集群可用 |
| 远程 MySQL | Metastore 独立服务 + 独立库 | 生产标准,支持高可用 |
5.3 生产部署要点
- Metastore 库用 MySQL,独立于业务库。
- Metastore 服务做 HA(多实例 + 负载均衡)。
- 定期备份元数据库,元数据丢失比数据丢失更麻烦。
六、Hive 3 的架构变化
| 变化 | 说明 |
|---|---|
| 默认引擎 | Tez 取代 MapReduce |
| 默认存储 | ORC + LLAP(Live Long and Process) |
| 物化视图 | 原生支持 |
| ACID | 全表支持事务(配合 ORC) |
| 无 Schema 检查 | 默认关闭,靠约束工具(如 dbt 风格)或自建校验 |
Hive 3 之后的定位已从"批处理工具"转向"数据仓库基础设施",与 LLAP/物化视图配合承担交互式查询。
七、常见问题速查
| 问题 | 原因与处理 |
|---|---|
| 查不到新表 | Metastore 缓存或连接问题,刷新/重启 Beeline 会话 |
| SQL 特别慢 | 检查是否走分区裁剪、小文件数、Join 类型 |
| 元数据锁等待 | 并发 DDL 冲突,调整锁等待与 DDL 窗口 |
| 引擎切换报错 | 检查 hive.execution.engine 与引擎资源 |
| 权限拒绝 | 走 HiveServer2 + Ranger 权限模型,检查策略 |