一、Hive到底是什么

1. 如何理解Hive
(1)从概念上来看

-> Hive是基于Hadoop的一个数据仓库工具;它是MapReduce的一个封装,底层就是MapReduce程序;

-> Hive可以将结构化的数据文件(eg:按照各字段分类的数据)映射成一张虚表,并提供类SQL查询功能;

-> 有了Hive后我们就不用再写麻烦的MapReduce程序了。

(2)从本质上来看

Hive就是把sql语句转化为MapReduce程序。

Hive没有服务端,它本质是Hadoop或者说是HDFS的一个客户端,对HDFS的数据和Meta store的元数据进行操作;

通常我们启动Hive是通过JDBC客户端操作的;

ps:对比hadoop中,通过命令start-dfs.sh启动HDFS服务端,然后通过hadoop fs -命令来启动HDFS客户端进行实际操作;

服务端是提供后台服务的,客户端是进行具体操作然后让服务端提供对应服务的。

2. Hive中SQL-MapReduce原理图解

(1)事先将常用的SQL操作封装成MapReduce模板存放在Hive中;

(2)client依据实际需求写SQL语句,匹配对应的MapReduce模板,然后运行对应的MapReduce程序,

(3)生成相应的分析结果,返回给client。

所以说,Hive的本质是把SQL语句转化成了MapReduce程序。

3. 为什么说Hive是基于Hadoop的呢?
(1)Hive处理的数据实际存放在HDFS中,默认路径/user/hive/warehouse;

(2)Hive分析数据的底层实现还是MapReduce程序;

(3)Hive调度资源时,用的是Yarn框架;

(4)在服务器中运行Hive之前需要群起HDFS和YARN。

二、Hive的优缺点
1. 优点
(1)简单、只需要写SQL语句就行;

(2)Hive常用于数据分析,适合处理离线数据(静态数据);

(3)优势在于处理大数据;

(4)支持用户自定义函数;

ps:mysql适合处理数据的增删改查,适合处理实时数据(动态数据)

2. 缺点
(1)Hive的表达有限,无法表达迭代式算法((第一个MapReducer程序的结果作为另一个MapReducer程序的输入,这种就是迭代式算法));

(2)数据挖掘不擅长(擅长数据挖掘的是Spark);

(3)Hive自动生成MapReduce作业,通常不够智能化,效率比较低;

(4)Hive调优一般比较困难,粒度较粗。

三、Hive的架构原理

1. 两种客户端
(1)CLI(command-line interface):命令行客户端(可以在shell中操作);

(2)JDBC客户端

2. 四种驱动Driver
(1)SQL Parser解析器:检查sql语法是否有错误;

(2)Physical Plan编译器:把sql语句转化成mr程序;

(3)Query Optimizer优化器:优化sql语句;

(4)Execution执行器:执行MR程序。

3. 元数据库Meta store
(1)Meta store是Hive数据库中的一个库,用于存储处理数据的元数据,包括:

表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等。

(2)Meta store默认存储在Hive自带的derby数据库中,但因为derby无法实现并发,实际工作中一般将derby替换为mysql;

(3)Hive中处理的数据分两部分存放:

         ① 处理的结构化数据,存储在HDFS中

         ② 表的元数据存储在元数据库mysql中

这样,有了表的元数据信息,就能找到对应的字段;然后把字段映射到结构化数据中,这样就可以通过映射形成一张虚表;

也就是说,表的元数据和mysql中的结构化数据,通过映射,构成一张虚表,用于Hive查询数据分析。

hive的存储过程:

启动hive时,会初始化hive,这时会在mysql中生成大约36张表(后续随着业务的复杂会增加),然后创建表,会在mysql中存放这个表的信息(不是以表的形式存在的,而是把表的属性以数据的形式放在mysql中,这样在hive中使用sql命令一样是能够查到这张表的)。然后把本地的文本文件使用hive命令格式化导入到表中,这样这些数据就存放到hdfs中,而不是在mysql或hive中。

四、Hive和数据库的区别
(1)数据存储位置不同
Hive中处理的结构化数据存储在HDFS中,元数据存储在mysql的Meta store中;

数据库将数据保存在块设备或本地文件系统中;

(2)数据更新
Hive是针对数据仓库设计的,主要用于读,所有的数据在加载时已经确定好,适合处理静态数据;

数据库通常是实时进行修改的,增删改查,适合处理动态数据;

(3)执行机制
Hive大多数查询的执行是通过Hadoop提供的MapReduce实现的;

数据库通常是用自己的引擎innodb;

(4)执行延迟
Hive因为没有索引、利用MapReduce框架执行查询,所以Hive本身的延迟较高;

数据库的延迟较低,但是不太适合处理PB级别以上海量数据;

处理海量数据时,Hive的优势就显出来了;

(5)可扩展性
Hive是建立在Hadoop上的,所以Hive也具备可扩展性,并发运行;

数据库由于ACID语义的严格限制,扩展性非常有限,例如目前最先进的并行数据库oracle在理论上扩展能力也就只有100台左右。

很明显,除了都用sql语句,Hive和数据库其实没啥太大关系。