赞
踩
一、首先是概念:
大体可以划分为七个方面,这样有利于理解记忆:
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 |
查询语言 | HQL | SQL |
据存储 | HDFS | Raw Device or Local FS |
执行器 | MapReduce | Executor |
数据插入 | 支持批量导入 / 单条插入 | 支持单条或者批量导入 |
数据操作 | 覆盖追加 | 行级更新删除 |
处理数据规模 | 大 | 小 |
执行延迟 | 高 | 低 |
分区 | 支持 | 支持 |
索引 | 0.8 版本之后加入简单索引 | 支持复杂的索引 |
扩展性 | 高(好) | 有限(差) |
数据加载模式 | 读时模式(快) | 写时模式(慢) |
应用场景 | 海量数据查询 | 实时查询 |
基本组成
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) 执行器:执行器是调用底层的运行框架执行逻辑执行计划
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。
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 表的数据存储目录中的数据进行增删操作。
分区表和分桶表的区别:Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。