文章目录
- 1.Hive的特点
- 2.Hive与RDBMS对比
- 3.Hive的优缺点
- 4.Hive的架构
- 5.Hive 底层与数据库交互原理
- 6.Hive 的 HSQL 转换为 MapReduce 的过程
- 7.Hive 的两张表关联,使用 MapReduce 怎么实现
- 8.hive 中 split、coalesce 及 collect_list 函数的用法
- 9.Hive保存元数据方式
1.Hive的特点
hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 sql 查询功能,可以将 sql 语句转换为MapReduce 任务进行运行。
其优点是学习成本低,可以通过类 SQL 语句快速实现简单的 MapReduce 统计,不必开发专门的 MapReduce 应用,十分适合数据仓库的统计分析,但是 Hive 不支持实时查询。
一般实时的用flink+kafka,离线用hive+spark
hive的本质就是将sql转换为MapReduce的任务进行运算。
底层是由HDFS提供数据存储的。
Hive理解为sql转化为MapReduce的工具。
2.Hive与RDBMS对比
由于Hive采用了类似SQL的查询语言HQL,因此很容易将Hive理解为数据库。其实从结构上来看,Hive和传统的关系数据库除了拥有类似的查询语言,再无相似之处。
1.查询语言
HQL <=> SQL 高度相似
2.数据规模
Hive存储海量数据;RDBMS只能处理有限的数据集
3.执行引擎
Hive的引擎是MR/Tez/Spark/Flink;RDBMS使用自己的执行引擎
4.数据存储
Hive采用的是HDFS,RDBMS保存在本地磁盘
5.执行速度
Hive相对慢,RDBMS相对快
6.可扩展性
Hive支持水平扩展;RDBMS通常支持垂直扩展,对水平扩展不友好。
7.数据更新
Hive不友好,RDBMS更新频繁
3.Hive的优缺点
1.学习成本低
2.处理海量数据。底层基于MapReduce
3.系统可以水平扩展。底层基于Hadoop
4.功能扩展好,支持UDF
5.容错性好,某一个节点宕机了,HQL依然可以完成
6.统一的元数据管理
1.HQL表达能力有限
2.迭代计算无法表达
3.执行效率不高,因为是基于MR的引擎.impala效率高
4.Hive的调优困难
4.Hive的架构
CLI命令行 -> Hive(解释器 -> 编译器 -> 优化器 -> 执行器) -> Hadoop(yarn,hdfs)/Mysql
Hive的基本数据类型及转换
5.Hive 底层与数据库交互原理
由于 Hive 的元数据可能要面临不断地更新、修改和读取操作,所以它显然不适合使用 Hadoop 文件系统进行存储。
目前 Hive 将元数据存储在 RDBMS 中,比如存储在 MySQL、Derby 中。元数据信息包括:存在的表、表的列、权限和更多的其他信息。
6.Hive 的 HSQL 转换为 MapReduce 的过程
HiveSQL -> AST(抽象语法树) -> QB(查询块) -> OperatorTree(操作树)-> 优化后的操作树 -> mapreduce 任务树 -> 优化后的 mapreduce 任务树
- SQL Parser:Antlr 定义 SQL 的语法规则,完成 SQL 词法,语法解析,将 SQL 转化为抽象语法树 AST Tree;
- Semantic Analyzer:遍历 AST Tree,抽象出查询的基本组成单元 QueryBlock;
- Logical plan:遍历 QueryBlock,翻译为执行操作树 OperatorTree;
- Logical plan optimizer: 逻辑层优化器进行 OperatorTree 变换,合并不必要的 ReduceSinkOperator,减少 shuffle 数据量;
- Physical plan:遍历 OperatorTree,翻译为 MapReduce 任务;
- Logical plan optimizer:物理层优化器进行 MapReduce 任务的变换,生成最终的执行计划;
7.Hive 的两张表关联,使用 MapReduce 怎么实现
1.如果一张为小表,可以小表join大表聚合
2.如果两张都为大表,采用联合key,联合 key 的第一个组成部分是 join on 中的公共字段,第二部分是一个 flag,0 代表表 A,1 代表表 B。
由此让 Reduce 区分客户信息和订单信息;在 Mapper 中同时处理两张表的信息,将 join on 公共字段相同的数据划分到同一个分区中,进而传递到一个 Reduce 中,然后在 Reduce 中实现聚合。
8.hive 中 split、coalesce 及 collect_list 函数的用法
split 将字符串转化为数组,即:split(‘a,b,c,d’ , ‘,’) ==> [“a”,“b”,“c”,“d”]
coalesce(T v1, T v2, …) 返回参数中的第一个非空值;如果所有值都为 NULL,那么返回 NULL。
collect_list 列出该字段所有的值,不去重 => select collect_list(id) from table
9.Hive保存元数据方式
1.内嵌式元存储服务器 2.本地元存储服务器 3.远程元存储服务器
内嵌式元存储主要用于单元测试,每次只有一个线程连接元存储,Derby是内置的数据库
本地模式下,每个 Hive 客户端都会打开到数据存储的连接并在该连接上请求 SQL 查询
在远程模式下,所有的 Hive 客户端都将打开一个到元数据服务器的连接,该服务器依次查询元数据,元数据服务器和客户端之间使用 Thrift 协议通信 。