Hive介绍

1、Hive概述

        a、Hive由Facebook实现并开源。

        b、基于Hadoop的一个数据仓库工具。

             1、hive是数据仓库,用来存储数据;

             2、真实存储在hive中的数据,底层数据存储在hdfs上的。

             3、Hive是一个使用SQL语句计算存储在HDFS上的数据的,底层执行引擎是MapReduce

             4、Hbase:数据库Hive:数据仓库;两者的区别:

                   4.1、数据库对于数据会做精细化的管理,具有事务的概念;数据仓库存储数据的格式就类似打包,没有事务概念;

                   4.2、操作方式区别:数据库Nosql语法 put get scan delete;数据仓库sql方言 hive的sql ===hql hibernate:hql

                   4.3、用途上的区别:数据库:OLTP 联机事务处理 增删改;数据仓库:OLAP 联机分析处理 查询; hive是数据仓库,它根本就不支持 update和delete但是支持insert;

                  4.4、模式上的区别:a、数据库:写模式 hbase无严格模式 仅有的模式校验只有表名和列的名称;b:数据仓库:写模式;

        c、可以将结构化的数据映射为一张数据库表。

              1、ORM对象关系映射 ORM 把存储在HDFS上的结构化的数据看做是一张二维表格   

        d、提供HQL(Hive SQL)查询功能。

              1、使用sql语句进行操作。

        e、底层数据是存储在HDFS上。

              1、hive是数据仓库,但本身不存储数据,仅仅只是用来存储描述存储在hdfs上的数据

              为了sql语句能够顺利执行,肯定需要把存储在hdfs上的数据,进行一番抽象并且把抽象出来的数据进行存储。hive就是存储这份数据 就叫做元数据。

               2、hive的元数据到底是什么?

                     hive的元数据就是描述存储在hdfs上的数据的数据,,hive数据仓库的元数据是一定不能丢失的。hive的元数据,是借用RDMS进行存储。最常用的就是mysql。

                     任何地方提到的元数据都是一个概念,都是指描述。

                     hdfs集群中会存储非常多的大文件的很多模块,namenode中就存储了"描述了存储在hdfs上的数据被切分成多少个数据块的数据",

        f、Hive的本质是将SQL转换为MapReduce任务执行。

             hive的本质作用就是把用户编写的sql语句转化成hadoop能够执行的MapReduce分布式计算程序去执行。

             hive的sql语句,你就应该把它看成一个MapReduce程序。但事实上一个sql是没法使用一个MapReduce去实现。

             hive的作用就是把sql转换成MapReduce

            数据仓库  +  工具

        g、使不熟悉MapReduce的用户方便地利用HQL处理和计算HDFS上的结构化的数据,适用于离线的批量数据计算。

1.1、产生背景

        a、存储在hdfs上的数据一般来说都是结构化的。

        b、计算存储在hdfs上的结构化的计算引擎是MapReduce,它的实现逻辑几乎和绝大多数的sql语句一致;

             实现一个工具:利用sql语句去计算存储在hdfs上的数据。只不过这个sql语句的执行需要转换成MapReduce。减少实现需求的复杂度。

1.2、hive的核心概念

        a、数据组织(1、库;2、表(内部表、外部表、分区表、分桶表);3、视图;4、数据文件)

        b、hive的架构

             1、用户接口: CLI、JDBC、ODBC、WebUI

             2、跨语言服务: Thrift Server

             3、内部四大组件: Driver、Compiler、Optimizer、Executor

             4、Metastore

             

2、hive系统架构

 

Hive的内部架构由四部分组成:

        1、用户接口: shell命令/CLI(command line interface采用交互形式使用hive命令行与hive进行交互)、jdbc/odbc(是hive基于jdbc提供的客户端,通过这个连接到hive server服务)、webui(通过浏览器访问hive);

        2、跨语言服务:  thrift server 提供了一种能力,让用户可以使用多种不同的语言来操作hive;

              thrift 是Facebook开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发,hive集成了该服务,能让不同的编程语言调用hive的接口。

        3、底层的Driver: 驱动器Driver、编译器Compile、优化器Optimizer、执行器Executor

             完成HQL的查询语句的词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在hdfs中,并由MapReduce调用执行。

             Hive组件完成HQL查询语句从词法分析,语法分析,编译,优化,以及生成逻辑执行计划的生成,生成的逻辑执行计划存储在hdfs中,并随后由MapReduce调用执行。

            hive的核心是驱动引擎,驱动引擎由四部分组成: 1、解释器:解释器的作用是将HiveSql语句转换为抽象语法;

2、编译器:编译器是将语法编译为逻辑执行计划;3、优化器:优化器是对逻辑执行计划的优化;4、执行器:执行器是调用底层的运行框架执行逻辑执行计划;

 

        4、元数据存储系统: RDBMS、Mysql;hive将元数据存储在数据库中,连接到这些数据库(mysql、derby)的模式分为三种:单用户模式、多用户模式、远程服务器模式。元数据包括database、表名、表的列以及类型、存储空间、分区、表数据所在目录等。

         a、执行流程:hive通过命令行或者客户端提交,经过complier编译器,运行MetaStore中的元数据进行类型检测和语法分析,生成一个逻辑方案,然后通过优化处理,产生一个MapReduce任务。

3、Hive基本操作和概念

    a、hive与文件系统的交互

             操作hdfs文件系统:   dfs -ls /;

             操作本地文件系统: !ls /opt/data;

        b、Hive数据类型

             基础数据类型:

                                  1、数值类型:TINYINT、SMALLINT、INT/INTEGER、BIGINT、FLOAT、DOUBLE、DECIMAL

                                  2、字符串:STRING、VARCHAR、CHAR;

                                  3、日期/时间类型:TIMESTAMP、DATE、INTERVAL;

                                  4、MISC类型:BOOLEAN、BINARY;

          复杂数据类型:ARRAY、MAP、STRUCT、UNIONTYPE

       c、Hive数据存储格式

             TextFile:行存储(按行存储)

             每一行都是一条记录,每行都以换行符(\n)结尾,数据不做压缩,磁盘开销大、数据解析开销大。可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。

             SequenceFile:行存储

             Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。支持三种压缩选择:NONE、RECORD、BLOCK(默认)。Record压缩效率低,一般建议使用BLOCK压缩。

             RCFile:行列相结合的存储方式

             按行分块,每块按照列存储。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于快速压缩和快速读取。

            ORC:行列存储相结合的存储方式

            提供了一种将数据存储在hive表中的高效方法。这个文件系统实际上是为了克服其他hive文件格式的限制而设计的。Hive从大型表读取,写入和处理数据时,使用ORC文件可以提高性能。压缩块,快速列存取,效率比rcfile高,是rcfile的改良版本。

           Parquet:列存储

           面向列的二进制文件格式。Parquet对于大型查询的类型是高效的。对于扫描特定表格中的特定列的查询,Parquet特别有用。Parquet可以使用snappy(默认)/gzip等压缩格式。相对于ORC,Parquet压缩比较低,查询效率较低,不支持update、insert和ACID。但是Parquet支持Impala查询引擎。

         总结:如果仅仅是在Hive中存储和查询,建议使用ORC格式;如果在Hive中存储,而使用Impala查询,建议使用Parquet

Text开销>RCFile>Parquet>ORCFile.

      d、DDL操作

          1、 表类型:

                      1.1、管理表/内部表/内建表

                     所有数据都保存在内部表指定的目录下(默认是/user/hive/warehouse/),分为创建过程和数据加载过程。

                     在加载数据时,将数据移动到内部表指定的目录。删除表时,元数据和数据都会被删除。

                       1.2、外部表:普通表、分区表、桶表;

                       所有数据都保存在外部表指定的目录下,只有一个过程。创建表和加载数据同时完成。

                      在加载数据时,将数据不会移动,指是建立一个链接。删除表时,只是删除元数据和链接,数据不会被删除。

                       1.3、分区表(细化管理一张表的所有数据,把数据进行分割开来进行存储)

                        分区表可以理解为分类,通过分类把不同类型的数据放到不同的目录下。分类的标准就是分区字段,可以一个或多个。分区表的意义在于优化查询。查询时尽量利用分区字段。如果不适用分区字段,就会全部扫描。

                       普通表:/user/hive/warehouse/test.db/student/beijing.txt

                       分区表:

                       /user/hive/warehouse/test.db/student/city=beijing/beijing.txt

                       /user/hive/warehouse/test.db/student/city=tianjin/tianjin.txt

                      1.4、桶表(跟MapReduce中的hashParititoner而一模一样)

                       每个桶对应一个分区下的文件,主要作用是提高连接查询的效率和提高采样效率。

                      数据进行哈希取值,然后将不同的数据放到不同的文件中。桶表专门用于抽样查询,不是日常用来存储数据的表,需要抽样查询时才使用。select a.* b.* from a join b on a.id= b.id;

                        分桶表:

                        /user/hive/warehouse/test.db/student/city=beijing/beijing_1.txt

                        /user/hive/warehouse/test.db/student/city=beijing/beijing_2.txt

                        /user/hive/warehouse/test.db/student/city=beijing/beijing_3.txt

        内部表和外部表的区别:

                                            1、删除内部表,删除表元数据和数据;

                                             2、删除外部表,删除元数据不删除数据;

         内部表和外部表使用选择:

                       大多数情况下,他们的区别不明显,如果数据的所有处理都在hive中进行,那么倾向与选择内部表,但是如果hive和其他工具要针对相同的数据集进行处理,外部表更合适。使用外部表访问存储在hdfs上的初始数据,然后通过hive转换数据并存到内部表中,使用外部表的场景针对一个数据集有多个不同的schema。

                      通过外部表和内部表的区别和使用选择的对比可以看出来,hive其实仅仅只是对存储在hdfs上的数据提供一种新的抽象。而不是管理存储在hdfs上的数据。所以不管创建内部表还是外部表,都可以对hive表的数据存储目录中的数据进行增删操作。

       分区表和分桶表的区别:

                    hive数据表可以根据某些字段进行分区操作,细化数据管理,可以让部分查询更快。同时表和分区也可以进一步被划分为buckets,分桶表的原理和MapReduce编程中的HashPartitioner的原理类似。

                   分区和分桶都是数据细化数据管理,但是分区表时手动添加分区,由于hive是读模式,所以对添加进分区的数据不做模式校验,分桶表中的数据时按照某些分桶字段进行hash散列形成的多个文件,所以数据的准确性也搞很多。

 

 

 

                   

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值