结构
Hive 是建立在hadoop上的数据仓库架构,它提供了一系列的工具,可以进行数据提取转换加载(这个过程叫做ETL),这是一种可以存储,查询和分析存储在hadoop中的大规模数据的机制.Hive定义了简单的类SQL查询语句 成为hql,他允许数据SQL的用户查询数据.同时 这个语言也允许数据mapreduce开发者的开发自定义mapper和reducer来处理内建的复杂的分析工作.
Hive的核心
hive的核心是Driver驱动引擎,驱动驱动有四部分组成:
1>解释器:解释器的作用是将HiveSQL语句转换为语法树(AST)
2>编译器:编译器是讲语法树编译为逻辑执行计划
3>优化器:优化是对逻辑执行计划进行优化
4>执行器:执行器是调用底层的运行康佳执行逻辑执行计划.
Hive的底层存储
Hive的数据是存储在HDFS上的 Hive中的库和表可以看做是HDFS上数据做的一个映射,所以Hive必须是运行在Hadoop集群上的.
Hive程序的执行过程
hive中的执行器,试讲最终要执行的MapReduce程序放在YARN上以一系列的Job的方式执行.
Hive的元数据的存储
HIve的元数据是一般是存储在MYSQL这种关系型数据库上的,Hive和MYSQL之间通过MetaStore服务交互.
Hive客户端
1>cli命令行客户端:采用交互窗口.用hive命令行和Hive进行通信
2>HiveSever2客户端:yongThrift写进行通信,Thrift是不同语言之间的转化器,是连接不同语言程序间的协议,通过JDBC或者ODBC去访问Hive
3>HWI客户端:hive自带的一个客户端,一般不用
4>HUE客户端:通过Web页面来和Hive进行交互,使用的比较多.
Hive与HADHOOP的关系
Hive构建在Hadoop之上
1>HQL中对查询语句的解析,优化,生成查询计划是由Hive完成的
2>所有的数据都是存储在Hadoop中
3>查询计划被转换为MapReduce任务,在Hadoop中执行(有些查询没MR任务,入select * from table)
4>Hadoop和Hive都是使用UTF-8编码的
Hive和普通关系数据库的异同
(1)查询语言.有SQL被广泛的应用在数据仓库中.因此,专门针对Hive的特性设计了类SQL的查询语言HQL 数据SQL开发者可以很方便的使用Hive进行开发的
(2)数据存储位置,Hive是建立在HAdoop之上的.所以HIve的数据都是存储在HDFS中的,而数据库则可以将数据保存在这块设备或者本地文件系统中
(3)数据格式.Hive中没有定义专门的数据格式,数据格式可以有用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格,'t','x001'),行分隔符以及读取文件数据的方法(Hive中默认有三个文件格式TextFile,SequenceFile以及RCFile),由于加载数据的过程中,不需要从用户数据格式到Hive定义的数据格式转换,因此Hive在加载的过程中不会对数据本身进行任何的修改,而只是将数据内容复制或者移动到相应的HDFS目录中.而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式,所有的数据都会按照一定的住址存储,因此数据库加载数据的过程会比较耗时.
(4)数据更新.由于Hive是针对数据仓库应用设计的.而数据仓库的内容都铎写少的,因此Hive中不支持数据的改写和添加,所有的数据都是在加载的时候中确定好的.而数据库中的数据通常是需要经常进行修改的,因此可以使用insert into ...values 添加数据,使用update ....set修改数据.
(5)索引,之前已经说过Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些Key建立索引,Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高,数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库中有很高的效率,较低的延迟,由于数据的访问延迟较高没界定了Hive不适合在线数据查询.
(6)执行,Hive中的大多数查询的执行师通过Hadoop提供的MapReduce来实现的,而数据库通常有自己的执行引擎.
(7)执行延迟:之前提到,Hive在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高,另外一个导致Hive执行延迟较高的因素是MapReduce框架,由于MapReduce本身具有较高的延迟,因此在利用MapReduce执行Hive查询时,也会有较高的延迟,相对的,数据库的执行延迟较低,当然,这个是有条件的,即数据量小,如果数据量很大,则延迟会远超过Hive
(8)可扩展性,由于Hive是建立在Hadoop之上的.因此Hive的可扩展性适合Hadoop的可扩展性是一致的,而数据库由于ACID语句的严格限制,扩展性非常有限,目前先进的并行数据库Oracle在理论上的扩展能力也只有100台左右
(8)数据规模:由于Hive建立在集群上并行利用MapReduce进行并行计算,因此可以支持很大规模的数据,对饮的,数据库可以支持的数据库规模较小.