hiveѧϰ
数据仓库
数据仓库是面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。
定义
hive是由facebook开源并实现。
hive是基于hadoop的数据仓库工具。
hive的元数据存储于关系型数据库中,真是数据存储于HDFS中。
hive是将HDFS中的数据映射为一张二维表。
hive提供HQL语句对数据进行操作。
hive的本质是将HQL语句转换为Mapreduce程序执行。
hive目的是简化MR程序的编写难度。
优缺点
优点
1、可扩展性:
横向扩展:可以自由的扩大集群规模,一般情况不需重启服务器。
纵向扩展:通过提升服务器的配置来扩展。
2、延展性:hive支持自定义函数,用户可根据需求自定义函数。
3、良好的容错性:可以保障即使节点出故障,HQL语句仍然可以执行完。
缺点
1、Hive 不支持记录级别的增删改操作,但是用户可以通过查询生成新表或者将查询结
果导入到文件中(当前选择的 hive-2.3.3 的版本支持记录级别的插入操作)
2、Hive 的查询延时很严重,因为 MapReduce Job 的启动过程消耗很长时间,所以不能
用在交互查询系统中。
3、Hive 不支持事务(因为没有增删改,所以主要用来做 OLAP(联机分析处理),而不
是 OLTP(联机事务处理),这就是数据处理的两大级别)。
Hive和RDBMS的对比
总结:Hive 只适合用来做海量离线数据统计分析,也就是数据仓库。
Hive 和 HBase 的差别
Hive 是基于Hadoop 之上为了简化 MapReduce 程序编码复杂度的ETL工具。
HBase 是分布式NoSQL数据库,为了弥补 Hadoop 对实时操作的缺陷。
Hive 表是纯逻辑表,Hive 的本身并不能做数据存储和计算,完全依赖 Hadoop。
HBase 是物理表,提供了一张超大的内存 Hash 表来存储索引,方便查询。
Hive 是数据仓库工具,需要全表扫描,就用 Hive,因为 Hive 是文件存储。
HBase 是数据库,需要索引访问则用 HBase,因为 HBase 是面向列的 NoSQL 数据库。
Hive 表中存入数据(文件)时不做校验,属于读模式存储系统。
HBase 表插入数据时,会和 RDBMS 一样做 Schema 校验,所以属于写模式存储系统。
Hive 不支持单行记录操作,数据处理依靠 MapReduce,操作延时高。
HBase 支持单行记录的 CRUD,并且是实时处理,效率比 Hive 高得多。
Hive架构
基本组成
一、用户接口
1、CLI:Shell 终端命令行(Command Line Interface),采用交互形式使用 Hive 命令行与 Hive进行交互,最常用(学习,调试,生产)。
2、JDBC/ODBC:是 Hive 的基于 JDBC 操作提供的客户端,用户(开发员,运维人员)通过这连接至 Hive server 服务。
3、Web UI:通过浏览器访问 Hive。
二、Thrift Server
Thrift 是 Facebook 开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发,
Hive 集成了该服务,能让不同的编程语言调用 Hive 的接口
三、元数据存储
元数据,通俗的讲,就是存储在 Hive 中的数据的描述信息。
Hive 中的元数据通常包括:表的名字,表的列和分区及其属性,表的属性(内部表和
外部表),表的数据所在目录Metastore 默认存在自带的 Derby 数据库中。缺点就是不适合多用户操作,并且数据存储目录不固定。数据库跟着 Hive 走,极度不方便管理。解决方案:通常存我们自己创建的 MySQL 库(本地 或 远程)Hive 和 MySQL 之间通过 MetaStore 服务交互
四、Driver:编译器(Compiler),优化器(Optimizer),执行器(Executor)
Driver 组件完成 HQL 查询语句从词法分析,语法分析,编译,优化,以及生成逻辑执行
计划的生成。生成的逻辑执行计划存储在 HDFS 中,并随后由 MapReduce 调用执行
Hive 的核心是驱动引擎, 驱动引擎由四部分组成:
(1) 解释器:解释器的作用是将 HiveSQL 语句转换为抽象语法树(AST)
(2) 编译器:编译器是将语法树编译为逻辑执行计划
(3) 优化器:优化器是对逻辑执行计划进行优化
(4) 执行器:执行器是调用底层的运行框架执行逻辑执行计划
五、Hive的执行流程
HiveQL 通过命令行或者客户端提交,通过解释器将 HiveSQL 语句转换为抽象语法树(AST),然后经过 Compiler 编译器,运用 MetaStore 中的元数据进行类型检测和语法分析,生成一个逻辑方案(Logical Plan),然后通过优化器对逻辑方案进行优化处理,再由执行器调用底层的运行框架执行逻辑执行计划产生一个 MapReduce 任务。
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 中的表分为内部表、外部表、分区表和 Bucket 表:
6.1、内部表和外部表的区别:
删除内部表,删除表元数据和数据
删除外部表,删除元数据,不删除数据
6.2、内部表和外部表的使用选择:
(1)大多数情况,他们的区别不明显,如果数据的所有处理都在 Hive 中进行,那么倾向于选择内部表,但是如果 Hive 和其他工具要针对相同的数据集进行处理,外部表更合适。
(2)使用外部表访问存储在 HDFS 上的初始数据,然后通过 Hive 转换数据并存到内部表中使用外部表的场景是针对一个数据集有多个不同的 Schema通过外部表和内部表的区别和使用选择的对比可以看出来,hive 其实仅仅只是对存储在HDFS 上的数据提供了一种新的抽象。而不是管理存储在 HDFS 上的数据。所以不管创建内部表还是外部表,都可以对 hive 表的数据存储目录中的数据进行增删操作。
6.3、分区表和分桶表的区别:
Hive 数据表可以根据某些字段进行分区操作,细化数据管理,可以让部分查询更快。同时表和分区也可以进一步被划分为 Buckets,分桶表的原理和 MapReduce 编程中的HashPartitioner 的原理类似分区和分桶都是细化数据管理,但是分区表是手动添加区分,由于 Hive 是读模式,所以对添加进分区的数据不做模式校验,分桶表中的数据是按照某些分桶字段进行 hash 散列形成的多个文件,所以数据的准确性也高很多。
来源:51CTO
作者:Hello hello!
链接:https://blog.csdn.net/Adam_cbp/article/details/100661879