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

    技术2023-07-04  64

    一、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程序)

     

    (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架构图

    两种客户端:

    (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和数据库其实没啥太大关系。  

    Processed: 0.009, SQL: 9