Hadoop学习(4)——Hive(1)数据仓库介绍

一、Hive简介

1.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客户端进行实际操作)

1.2、Hive中SQL-MapReduce原理图解(Hive本质是把SQL语句转化成MapReduce程序)

Hadoop学习(4)——Hive(1)数据仓库介绍

 

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

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

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

1.3、为什么说Hive是基于Hadoop的呢


(1)Hive处理的数据实际存放在HDFS中,默认路径/user/hive/warehouse;

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

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

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


1.4、Hive优缺点

优点:

(1)简单、只需要写SQL语句就行;

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

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

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

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

缺点:


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

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

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

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

二、Hive原理

2.1、Hive架构图

Hadoop学习(4)——Hive(1)数据仓库介绍

两种客户端:

(1)CLI:命令行客户端(可以在shell中操作);

(2)JDBC客户端

四种驱动Driver

(1)SQL Parser解析器:检查sql语法是否有错误;

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

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

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

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

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

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

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

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

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


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

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

2.2、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级别以上海量数据;

(5)可扩展性

  • Hive是建立在Hadoop上的,所以Hive也具备可扩展性,并发运行;
  • 数据库由于ACID语义的严格限制,扩展性非常有限,例如目前最先进的并行数据库oracle在理论上扩展能力也就只有100台左右。

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