Hive的原理架构一

一、首先是概念:
大体可以划分为七个方面,这样有利于理解记忆:
1、由FaceBook实现并开源;
2、基于Hadoop的开源数据仓库工具,用于存储结构化的数据;
3、可以将结构化的数据映射为一张数据库表;
4、底层数据存储在HDFS文件系统上,描述数据的数据(元数据)存储在derby或者是远程数据库中,如:mysql;
5、提供一套类数据库的处理机制,HQL查询功能;
6、本质是将SQL语句转换为MapReduce任务运行;
7、使不熟悉MapReduce的用户很方便的利用HQL处理和计算HDFS上的结构化数据,适用于离线批量数据计算。

二、优缺点
优点
1、可扩展:Hive可以自由的扩展集群的规模,一般情况下不需要重启服务.
2、延展性: Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数.
3、容错:良好的容错性,节点出现问题SQL仍可完成执行.
缺点
1、不支持记录级别的更新、插入和删除操作:
Hive不是一个完整的数据库。Hadoop以及hdfs的设计本身约束和局限性地限制了hive所能胜任的工作。Hive不支持记录级别的更新、插入和删除操作。但是用户可以通过查询生成新表或者将查询结果导入到文件中。
2、查询延时比较严重:
因为Hadoop是一个面向批处理的系统,而mapreduce任务(job)的启动过程需要消耗较长的时间,所以hive查询延时比较严重。传统数据库中在秒级可以完成的查询,在hive中,即时数据集相对较小,往往也需要执行更长的时间。由于Hadoop本身的时间开销很大,并且Hadoop所被设计用来处理的数据规模非常大,因此提交查询和返回结果是可能具有非常大的延时的,所以hive并不能满足OLAP的“联机”部分,至少目前并没有满足。如果用户需要对大规模数据使用OLTP功能的话,那么应该选择使用一个NOSQL数据库。例如,和Hadoop结合使用的HBase及Cassandra.
3、不支持事务:
因为不没有增删改,所以主要用来做 OLAP(联机分析处理),而不是 OLTP(联机事务处理),这就是数据处理的两大级别。

三、Hive 和 RDBMS 的对比
对比项 HiveRDBMS
查询语言HQLSQL
据存储 HDFSRaw Device or Local FS
执行器MapReduce        Executor
数据插入支持批量导入 / 单条插入支持单条或者批量导入
数据操作覆盖追加行级更新删除
处理数据规模
执行延迟
分区支持支持
索引0.8 版本之后加入简单索引支持复杂的索引
扩展性高(好)有限(差)
数据加载模式读时模式(快)写时模式(慢)
应用场景海量数据查询实时查询

总结:Hive 具有 SQL 数据库的外表,但应用场景完全不同,Hive  只适合用来做海量离线数据统计分析,也就是数据仓库。
四、架构


基本组成
1、 用户接口
CLI,Shell 终端命令行(Command Line Interface),采用交互形式使用 Hive 命令行与 Hive进行交互,最常用(学习,调试,生产)JDBC/ODBC,是 Hive 的基于 JDBC 操作提供的客户端,用户(开发员,运维人员)通过这连接至 Hive server 服务Web UI,通过浏览器访问 Hive
2、Thrift Server
Thrift 是 Facebook 开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发,Hive 集成了该服务,能让不同的编程语言调用 Hive 的接口
3 、 元数据存储
元数据,通俗的讲,就是存储在 Hive 中的数据的描述信息。Hive 中的元数据通常包括:表的名字,表的列和分区及其属性,表的属性(内部表和外部表),表的数据所在目录Metastore 默认存在自带的 Derby 数据库中。缺点就是不适合多用户操作,并且数据存储目录不固定。数据库跟着 Hive 走,极度不方便管理。
解决方案:通常存我们自己创建的 MySQL 库( 本地 或  远程)Hive 和 MySQL 之间通过 MetaStore 服务交互。
4 、Driver : 编译器 (Compiler) ) ,优化器 (Optimizer) ) ,执行器 (Executor )
Driver 组件完成 HQL 查询语句从词法分析,语法分析,编译,优化,以及生成逻辑执行
计划的生成。生成的逻辑执行计划存储在 HDFS 中,并随后由 MapReduce 调用执行
Hive 的核心是驱动引擎, 驱动引擎由四部分组成:
(1) 解释器:解释器的作用是将 HiveSQL 语句转换为抽象语法树(AST)
(2) 编译器:编译器是将语法树编译为逻辑执行计划
(3) 优化器:优化器是对逻辑执行计划进行优化
(4) 执行器:执行器是调用底层的运行框架执行逻辑执行计划

五、Hive的工作原理如下:
接收到一个sql,后面做的事情包括:
1.词法分析/语法分析:使用antlr将SQL语句解析成抽象语法树-AST
2.语义分析:从Megastore获取模式信息,验证SQL语句中队表名,列名,以及数据类型的检查和隐式转换,以及Hive提供的函数和用户自定义的函数(UDF/UAF)
3.逻辑计划生产:生成逻辑计划-算子树
4.逻辑计划优化:对算子树进行优化,包括列剪枝,分区剪枝,谓词下推等
5.物理计划生成:将逻辑计划生产包含由MapReduce任务组成的DAG的物理计划
6.物理计划执行:将DAG发送到Hadoop集群进行执行
7.将查询结果返回


Query Compiler:


新版本的Hive也支持使用Tez或Spark作为执行引擎。




物理计划可以通过hive的Explain命令输出,例如:

0: jdbc:hive2://master:10000/dbmfz> explain select count(*) from record_dimension;
+------------------------------------------------------------------------------------------------------+--+
|                                               Explain                                                |
+------------------------------------------------------------------------------------------------------+--+
| STAGE DEPENDENCIES:                                                                                  |
|   Stage-1 is a root stage                                                                            |
|   Stage-0 depends on stages: Stage-1                                                                 |
|                                                                                                      |
| STAGE PLANS:                                                                                         |
|   Stage: Stage-1                                                                                     |
|     Map Reduce                                                                                       |
|       Map Operator Tree:                                                                             |
|           TableScan                                                                                  |
|             alias: record_dimension                                                                  |
|             Statistics: Num rows: 1 Data size: 543 Basic stats: COMPLETE Column stats: COMPLETE      |
|             Select Operator                                                                          |
|               Statistics: Num rows: 1 Data size: 543 Basic stats: COMPLETE Column stats: COMPLETE    |
|               Group By Operator                                                                      |
|                 aggregations: count()                                                                |
|                 mode: hash                                                                           |
|                 outputColumnNames: _col0                                                             |
|                 Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE    |
|                 Reduce Output Operator                                                               |
|                   sort order:                                                                        |
|                   Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE  |
|                   value expressions: _col0 (type: bigint)                                            |
|       Reduce Operator Tree:                                                                          |
|         Group By Operator                                                                            |
|           aggregations: count(VALUE._col0)                                                           |
|           mode: mergepartial                                                                         |
|           outputColumnNames: _col0                                                                   |
|           Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE          |
|           File Output Operator                                                                       |
|             compressed: false                                                                        |
|             Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE        |
|             table:                                                                                   |
|                 input format: org.apache.hadoop.mapred.SequenceFileInputFormat                       |
|                 output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat             |
|                 serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe                            |
|                                                                                                      |
|   Stage: Stage-0                                                                                     |
|     Fetch Operator                                                                                   |
|       limit: -1                                                                                      |
|       Processor Tree:                                                                                |
|         ListSink                                                                                     |
|                                                                                                      |
+------------------------------------------------------------------------------------------------------+--+
42 rows selected (0.844 seconds)
除了DML,Hive也提供DDL来创建表的schema。
Hive数据存储支持HDFS的一些文件格式,比如CSV,Sequence File,Avro,RC File,ORC,Parquet。也支持访问HBase。
Hive提供一个CLI工具,类似Oracle的sqlplus,可以交互式执行sql,提供JDBC驱动作为Java的API。

六、Hive  的数据存储

1、Hive的存储结构包括数据库、表、视图、分区和表数据等。数据库,表,分区等等都对应HDFS上的一个目录。表数据对应HDFS对应目录下的文件。
2、Hive中所有的数据都存储在HDFS中,没有专门的数据存储格式,因为Hive是读模式(Schema On Read),可支持TextFile,SequenceFile,RCFile 或者自定义格式等。
3、只需要在创建表的时候告诉 Hive 数据中的 列分隔符和 行分隔符,Hive 就可以解析数据。
      Hive 的默认列分隔符:控制符 Ctrl + A,\x01
      Hive 的默认行分隔符:换行符 \n
4、Hive中包含以下数据模型:
database:在 HDFS 中表现为${hive.metastore.warehouse.dir}目录下一个文件夹。
table:在 HDFS 中表现所属 database 目录下一个文件夹。
external table:与 table 类似,不过其数据存放位置可以指定任意 HDFS 目录路径。
partition:在 HDFS 中表现为 table 目录下的子目录。
bucket:在 HDFS 中表现为同一个表目录或者分区目录下根据某个字段的值进行 hash 散列之后的多个文件。
view:与传统数据库类似,只读,基于基本表创建。
5、Hive的元数据存储在 RDBMS 中,除元数据外的其它所有数据都基于 HDFS 存储。默认情况下,Hive 元数据保存在内嵌的 Derby 数据库中,只能允许一个会话连接,只适合简单的测试。实际生产环境中不适用,为了支持多用户会话,则需要一个独立的元数据库,使用MySQL 作为元数据库,Hive 内部对 MySQL 提供了很好的支持。

6、Hive中的表分为内部表、外部表、分区表和分桶表。

内部表和外部表的区别:
删除内部表,删除表元数据和数据

删除外部表,删除元数据,不删除数据

内部表和外部表的使用选择:

大多数情况,他们的区别不明显,如果数据的所有处理都在 Hive 中进行,那么倾向于选择内部表,但是如果 Hive 和其他工具要针对相同的数据集进行处理,外部表更合适。使用外部表访问存储在 HDFS 上的初始数据,然后通过 Hive 转换数据并存到内部表中使用外部表的场景是针对一个数据集有多个不同的 Schema通过外部表和内部表的区别和使用选择的对比可以看出来,hive 其实仅仅只是对存储在HDFS 上的数据提供了一种新的抽象。而不是管理存储在 HDFS 上的数据。所以不管创建内部表还是外部表,都可以对 hive 表的数据存储目录中的数据进行增删操作。

分区表和分桶表的区别:
Hive 数据表可以根据某些字段进行分区操作,细化数据管理,可以让部分查询更快。同时表和分区也可以进一步被划分为 Buckets,分桶表的原理和 MapReduce 编程中的HashPartitioner 的原理类似分区和分桶都是细化数据管理,但是分区表是手动添加区分,由于 Hive 是读模式,所以对添加进分区的数据不做模式校验,分桶表中的数据是按照某些分桶字段进行 hash 散列形成的多个文件,所以数据的准确性也高很多。


  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值