HiveOverwrite
Hive架构图
Client
hive shell、JDBC/ODBC(java访问hive)、WEBUI
元数据:Meta store
表名、表所属数据库、表的拥有者、列/分区字段、表的类型、表的数据所在目录
在 Hive 中,表名、表结构、字段名、字段类型、表的分隔符等统一被称为元数据。所有的元数据默认存储在 Hive 内置的 derby 数据库中,但由于 derby 只能有一个实例,也就是说不能有多个命令行客户端同时访问,所以在实际生产环境中,通常使用 MySQL 代替 derby。
Hive 进行的是统一的元数据管理,就是说你在 Hive 上创建了一张表,然后在 presto/impala/sparksql 中都是可以直接使用的,它们会从 Metastore 中获取统一的元数据信息,同样的你在 presto/impala/sparksql 中创建一张表,在 Hive 中也可以直接使用。
Driver
解析器:将SQL字符串转换成抽象语法树AST,一般使用antlr对AST进行语法分析,比如表是否存在等
编译器:将AST编译生成执行计划
优化器:对逻辑执行计划进行优化
执行器:基于MR/Spark做计算
HQL的执行流程
语法解析:Antlr 定义 SQL 的语法规则,完成 SQL 词法,语法解析,将 SQL 转化为抽象 语法树 AST Tree;
语义解析:遍历 AST Tree,抽象出查询的基本组成单元 QueryBlock;
生成逻辑执行计划:遍历 QueryBlock,翻译为执行操作树 OperatorTree;
优化逻辑执行计划:逻辑层优化器进行 OperatorTree 变换,合并不必要的
ReduceSinkOperator,减少 shuffle 数据量
;生成物理执行计划:遍历 OperatorTree,翻译为 MapReduce 任务;
优化物理执行计划:物理层优化器进行 MapReduce 任务的变换,生成最终的执行计划。
数据类型
基本数据类型
大类 | 类型 |
---|---|
Integers(整型) | TINYINT—1 字节的有符号整数 SMALLINT—2 字节的有符号整数 INT—4 字节的有符号整数 BIGINT—8 字节的有符号整数 |
Boolean(布尔型) | BOOLEAN—TRUE/FALSE |
Floating point numbers(浮点型) | FLOAT— 单精度浮点型 DOUBLE—双精度浮点型 |
Fixed point numbers(定点数) | DECIMAL—用户自定义精度定点数,比如 DECIMAL(7,2) |
String types(字符串) | STRING—指定字符集的字符序列 VARCHAR—具有最大长度限制的字符序列 CHAR—固定长度的字符序列 |
Date and time types(日期时间类型) | TIMESTAMP — 时间戳 TIMESTAMP WITH LOCAL TIME ZONE — 时间戳,纳秒精度 DATE—日期类型 |
Binary types(二进制类型) | BINARY—字节序列 |
隐式转换
Hive 中基本数据类型遵循以下的层次结构,按照这个层次结构,子类型到祖先类型允许隐式转换。例如 INT 类型的数据允许隐式转换为 BIGINT 类型。额外注意的是:按照类型层次结构允许将 STRING 类型隐式转换为 DOUBLE 类型。
复杂类型
类型 | 描述 | 示例 |
---|---|---|
STRUCT | 类似于对象,是字段的集合,字段的类型可以不同,可以使用 | STRUCT ('xiaoming', 12 , '2018-12-12') |
MAP | 键值对的集合,可以使用 | map('a', 1, 'b', 2) |
ARRAY | 数组是一组具有相同类型和名称的变量的集合,可以使用 | ARRAY('a', 'b', 'c', 'd') |
Hive安装部署
hive-env.sh
集群配置
配置MySql metastore
将mysql驱动放入hive的lib目录下
$HIVE_HOME/scripts/metastore/upgrade/mysql找到对应版本的scheme.sql
常见属性配置
数据仓库位置配置
查询后信息显示配置
运行日志配置
关闭元数据检查
修改hive-site.xml
Hive运行Tez
Hive底层MR引擎
Tez引擎
Hive中配置Tez
环境准备
配置hive-env.sh
配置hive-site.xml
配置Hive On tez
tez-site.xml
上传Tez到集群
配置Hive On Spark
Hive的运行机制
Hive和数据库比较
查询语言
Hive提供类SQL的语言,HQL。
数据存储位置
Hive存在在Hadoop的HDFS或者其他分布式文件系统中,数据库存放在数据库中
数据更新
Hive适合读多写少的,Hive不建议对数据进行改写,所有数据都在加载确定好的,数据库则适合传统的curd。
索引
Hive在加载数据的过程中不会对数据做任何处理,甚至不会对数据进行扫描,因此也没有对数据的某些key建立索引。Hive要访问数据中满足条件的特定值时,需要暴力扫描整个目录的数据。但是Hive可以基于Spark、MR做并行访问数据,因此可以支持大量数据访问。Hive支持BitMap和Compact索引。
最后更新于