Hive是一个开源的,建立在Hadoop上的数据仓库框架,提供类似SQL的HQL语言操作结构化数据,其基本原理是将HQL语言自动转换成Mapreduce任务或Tez任务或Spark任务,从而完成对Hadoop集群中存储的海量数据进行查询和分析。
一、核心组件
1. 用户接口(User Interfaces)
- CLI:命令行接口,用户直接输入 HiveQL 查询。
- JDBC/ODBC(Beeline):允许应用程序通过标准数据库连接方式与 Hive 交互。
- Web UI:Hive 提供的简单 Web 界面(Hive Web Interface,HWI)。
2. Driver(驱动器)/ Hive SQL 执行流程
Driver用来接收用户查询,负责会话管理、查询编译、优化及执行计划的生成。Driver 包含:
- Parser(解析器):将 HiveQL 字符串解析为抽象语法树(AST)。
- Semantic Analyzer(语义分析器):借助 Metastore 获取表、列、分区等元数据,对 AST 进行语义校验,并将 AST 转换为内部查询块(Query Block),此时补全类型推导、隐式转换等信息。
- Logical Plan Generator(逻辑计划生成器):将 Query Block 转换成初始的逻辑执行计划,即一棵由Operator算子组成的 Operator Tree(操作符树),代表数据的流向和操作。常见算子如下:
TableScanOperator:读取 HDFS 文件。→ Map TaskFilterOperator:执行 WHERE 过滤。SelectOperator:选取或计算列。JoinOperator:两张表连接。→ Reduce TaskGroupByOperator:分组聚合。→ Reduce TaskReduceSinkOperator:将数据按 Key 分发到 Reducer(Map 和 Reduce 的边界)。FileSinkOperator:写入目标表/临时结果。
- Optimizer(优化器):对逻辑计划进行一系列改写和优化,如谓词下推、分区修剪、列裁剪、Map Join 转换、公共表达式消除等,得到优化后的逻辑计划。
- Physical Plan Generator(物理计划生成器):将优化后的逻辑计划翻译为物理执行计划(Task Tree)。这一步与具体执行引擎绑定:MR、Tez 或 Spark。
Executor(执行器):按物理计划的依赖顺序,将 Task 提交给执行引擎。并监控执行进度,最后返回结果给客户端。如果是
SELECT查询,最后一个任务会将结果写入临时目录,然后由客户端读取并显示;如果是INSERT等操作,结果会直接写入目标表(HDFS 目录或分区)。MR 模式:通过
JobClient提交到 YARN。Tez 模式:提交一个 DAG 到 Tez Session。
Spark 模式:提交到 Spark 集群。
3. Metastore(元数据存储)
存储 Hive 表的元数据(如表名、列名、分区信息、表所在的 HDFS 路径等)。通常使用关系型数据库(如 Derby、MySQL、PostgreSQL)来存储。Metastore 分为三个部分:
- Metastore Service:提供元数据访问接口。
- Metastore Database:实际存储元数据的数据库。
- Metastore Client:内嵌在 Hive 服务中的客户端,用于与 Metastore Service 通信。
hive的metastore的三种模式
内嵌Derby方式:这个是Hive默认的启动模式,一般用于单元测试,这种存储方式有一个缺点:在同一时间只能有一个进程连接使用数据库。
Local方式:本地MySQL
Remote方式:远程MySQL,一般常用此种方式
4. Execution Engine(执行引擎)
负责执行物理计划。Hive 支持多种执行引擎:
- MapReduce(默认):稳定可靠,但中间结果写入磁盘,适合批处理,延迟较高。
- Tez(基于有向无环图DAG的优化引擎):将传统MapReduce作业拆解为更基础的元操作(如Input、Sort、Merge),并通过DAG灵活组合。这使得一个复杂任务可以在一个Tez作业中完成,无需像MapReduce那样串联多个独立的Job。
- Spark(内存计算引擎):基于内存计算,支持 DAG 和更多优化,适合交互式查询和迭代计算。
数据存储:基于 HDFS,计算资源由 YARN 管理。
二、内部表与外部表
1. 内部表 (Managed Table / Internal Table)
定义:Hive 完全管理这张表的生命周期,包括元数据和数据文件。
存储位置:默认在
hive.metastore.warehouse.dir指定的目录下(如/user/hive/warehouse)。数据生命周期:
DROP TABLE时,元数据和 HDFS 上的数据文件都会被删除。TRUNCATE TABLE会清空数据文件。
2. 外部表 (External Table)
定义:Hive 只管理元数据,数据文件由用户自行管理,一般用于引用已经存在于 HDFS 上的数据。
创建时:需要用
EXTERNAL关键字,并通常用LOCATION指定数据路径。数据生命周期:
DROP TABLE时,只删除元数据,HDFS 上的数据文件保留。TRUNCATE TABLE对外部表不可用(不允许截断外部数据)。
TBLPROPERTIES ('external.table.purge'='true'): 该参数让外部表支持类似内部表的清理操作(执