**

一、Hive介绍

Hive官网:https://hive.apache.org/

1.1 hive简介
Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据。它架构在Hadoop之上,总归为大数据,并使得查询和分析方便。并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。

最初,Hive是由Facebook开发,后来由Apache软件基金会开发,并作为进一步将它作为名义下Apache Hive为一个开源项目。Hive 没有专门的数据格式。 Hive 可以很好的工作在 Thrift 之上,控制分隔符,也允许用户指定数据格式。Hive不适用于在线事务处理。 它最适用于传统的数据仓库任务。

Hive 构建在基于静态批处理的Hadoop 之上,Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive 并不能够在大规模数据集上实现低延迟快速的查询,例如,Hive 在几百MB 的数据集上执行查询一般有分钟级的时间延迟。因此,
Hive 并不适合那些需要低延迟的应用,例如,联机事务处理(OLTP)。Hive 查询操作过程严格遵守Hadoop MapReduce 的作业执行模型,Hive 将用户的HiveQL 语句通过解释器转换为MapReduce 作业提交到Hadoop 集群上,Hadoop 监控作业执行过程,然后返回作业执行结果给用户。Hive 并非为联机事务处理而设计,Hive 并不提供实时的查询和基于行级的数据更新操作。Hive 的最佳使用场合是大数据集的批处理作业,例如,网络日志分析。

1.2Hive的起源
Hive起源于Facebook(一个美国的社交服务网络)。Facebook有着大量的数据,而Hadoop是一个开源的MapReduce实现,可以轻松处理大量的数据。但是MapReduce程序对于Java程序员来说比较容易写,但是对于其他语言使用者来说不太方便。此时Facebook最早地开始研发Hive,它让对Hadoop使用SQL查询(实际上SQL后台转化为了MapReduce)成为可能,那些非Java程序员也可以更方便地使用。hive最早的目的也就是为了分析处理海量的日志。

2、Hive是什么

2.1、Hive是数据仓库
数据仓库英文名DataWarehouse,可简写为DW或DWH。数据仓库 ,由数据仓库之父比尔·恩门(Bill Inmon)于1990年提出,主要功能仍是将组织透过资讯系统之联机事务处理(OLTP)经年累月所累积的大量资料,透过数据仓库理论所特有的资料储存架构,作一有系统的分析整理,以利各种分析方法如联机分析处理(OLAP)、数据挖掘(Data Mining)之进行,并进而支持如决策支持系统(DSS)、主管资讯系统(EIS)之创建,帮助决策者能快速有效的自大量资料中,分析出有价值的资讯,以利决策拟定及快速回应外在环境变动,帮助建构商业智能(BI)。往白了说数据仓库就是用来作为查询分析的数据库,很少用来插入,修改,删除

2.2、Hive是解释器、编译器、优化器、执行器
简单的将就是说HQL会被Hive解释,编译,优化并生成查询计划,一般情况而言查询计划会被转化为MapReduce任务进而执行。

2.3 Hive的特点:

通过SQL轻松访问数据的工具,从而实现数据仓库任务(如提取/转换/加载(ETL),报告和数据分析)。

一种对各种数据格式施加结构的机制

访问直接存储在Apache HDFS或其他数据存储系统(如Apache HBase)中的文件

通过Apache Tez,Apache Spark或MapReduce执行查询

程序语言与HPL-SQL

通过Hive LLAP,Apache YARN和Apache Slider进行亚秒级查询检索。

Hive提供了标准的SQL功能,其中包括许多后来用于分析的SQL:2003和SQL:2011功能。
Hive的SQL还可以通过用户定义的函数(UDF),用户定义的聚合(UDAF)和用户定义的表函数(UDTF)用用户代码进行扩展。
没有一个数据必须存储的“Hive格式”。 Hive带有用于逗号和制表符分隔值(CSV / TSV)文本文件,Apache Parquet,Apache ORC和其他格式的内置连接器。用户可以使用其他格式的连接器来扩展Hive。
Hive不适用于联机事务处理(OLTP)工作负载。它最适用于传统的数据仓库任务。
Hive旨在最大限度地提高可伸缩性(在Hadoop集群中动态添加更多机器的规模),性能,可扩展性,容错性以及与输入格式的松散耦合。
Hive的组件包括HCatalog和WebHCat。
HCatalog是Hive的一个组件。这是Hadoop的表和存储管理层,使用不同数据处理工具(包括Pig和MapReduce)的用户可以更方便地在网格上读写数据。
WebHCat提供的服务可以用来运行Hadoop MapReduce(或YARN),Pig,Hive作业或使用HTTP(REST风格)接口执行Hive元数据操作。

2.4 Hive架构与基本组成

hadoop内的hive hadoop hive_Hive


2.5 Hive的体系结构:

#上图为Hive的体系结构,可以分为以下几个部分:

用户接口主要有三个:CLI,Client和WUI.其中最常用的是CLI,CLI启动的时候,会同时启动一个Hive副本。Client是Hive的客户端,用户连接至Hive Server。在启动Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server。WUI是通过浏览器访问Hive。

Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,表的列和分区以及属性,表的属性(是否为外部表等),表的数据所在目录等。

解释器、编辑器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。

Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成。

服务端和客户端组件:
  由上图可知,hadoop和mapreduce是hive架构的根基。Hive架构包括如下组件:CLI(command line interface)、JDBC/ODBC、Thrift Server、WEB GUI、metastore和Driver(Complier、Optimizer和Executor),这些组件我可以分为两大类:服务端组件和客户端组件。
  服务端组件:

Driver组件:该组件包括Complier、Optimizer和Executor,它的作用是将我们写的HiveQL(类SQL)语句进行解析、编译优化,生成执行计划,然后调用底层的mapreduce计算框架。
Metastore组件:元数据服务组件,这个组件存储hive的元数据,hive的元数据存储在关系数据库里,hive支持的关系数据库有derby、mysql。元数据对于hive十分重要,因此hive支持把metastore服务独立出来,安装到远程的服务器集群里,从而解耦hive服务和metastore服务,保证hive运行的健壮性,这个方面的知识,我会在后面的metastore小节里做详细的讲解。
Thrift服务:thrift是facebook开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,hive集成了该服务,能让不同的编程语言调用hive的接口。
客户端组件:

CLI:command line interface,命令行接口。
 Thrift客户端:上面的架构图里没有写上Thrift客户端,但是hive架构的许多客户端接口是建立在thrift客户端之上,包括JDBC和ODBC接口。
 WEBGUI:hive客户端提供了一种通过网页的方式访问hive所提供的服务。这个接口对应hive的hwi组件(hive web interface),使用前要启动hwi服务。
Hive的metastore组件
Hive的metastore组件是hive元数据集中存放地。Metastore组件包括两个部分:metastore服务和后台数据的存储。后台数据存储的介质就是关系数据库,例如hive默认的嵌入式磁盘数据库derby,还有mysql数据库。Metastore服务是建立在后台数据存储介质之上,并且可以和hive服务进行交互的服务组件,默认情况下,metastore服务和hive服务是安装在一起的,运行在同一个进程当中。我也可以把metastore服务从hive服务里剥离出来,metastore独立安装在一个集群里,hive远程调用metastore服务,这样我们可以把元数据这一层放到防火墙之后,客户端访问hive服务,就可以连接到元数据这一层,从而提供了更好的管理性和安全保障。使用远程的metastore服务,可以让metastore服务和hive服务运行在不同的进程里,这样也保证了hive的稳定性,提升了hive服务的效率。

2.6连接到数据库的模式:
有三种模式可以连接到数据库:

单用户模式。此模式连接到一个In-memory 的数据库Derby,一般用于Unit Test。

多用户模式。通过网络连接到一个数据库中,是最经常使用到的模式。

远程服务器模式。用于非Java客户端访问元数据库,在服务器端启动MetaStoreServer,客户端利用Thrift协议通过MetaStoreServer访问元数据库。

对于数据存储,Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织Hive中的表,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。
Hive中所有的数据都存储在HDFS中,存储结构主要包括数据库、文件、表和视图。Hive中包含以下数据模型:Table内部表,External Table外部表,Partition分区,Bucket桶。
Hive默认可以直接加载文本文件,还支持sequence file 、RCFile。
Hive的数据模型介绍:
官网介绍:https://cwiki.apache.org/confluence/display/Hive/Tutorial

Hive数据库。 类似传统数据库的DataBase,在第三方数据库里实际是一张表。简单示例命令行 hive > create database test_database;

内部表。 Hive的内部表与数据库中的Table在概念上是类似。每一个Table在Hive中都有一个相应的目录存储数据。例如一个表pvs,它在HDFS中的路径为/wh/pvs,其中wh是在hive-site.xml中由${hive.metastore.warehouse.dir} 指定的数据仓库的目录,所有的Table数据(不包括External Table)都保存在这个目录中。删除表时,元数据与数据都会被删除。 内部表简单示例如下:

创建数据文件:test_inner_table.txt
创建表:create table test_inner_table (key string)
加载数据:LOAD DATA LOCAL INPATH ‘filepath’ INTO TABLE test_inner_table
查看数据:select * from test_inner_table;  select count(*) from test_inner_table
删除表:drop table test_inner_table
  1. 外部表。 外部表指向已经在HDFS中存在的数据,可以创建Partition。它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异。内部表的创建过程和数据加载过程这两个过程可以分别独立完成,也可以在同一个语句中完成,在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据对访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除。而外部表只有一个过程,加载数据和创建表同时完成(CREATE EXTERNAL TABLE ……LOCATION),实际数据是存储在LOCATION后面指定的 HDFS 路径中,并不会移动到数据仓库目录中。当删除一个External Table时,仅删除该链接。 外部表简单示例:
    创建数据文件:test_external_table.txt
    创建表:create external table test_external_table (key string)
    加载数据:LOAD DATA INPATH ‘filepath’ INTO TABLE test_inner_table
    查看数据:select * from test_external_table; •select count(*) from test_external_table
    删除表:drop table test_external_table
  2. 分区。 Partition对应于数据库中的Partition列的密集索引,但是Hive中Partition的组织方式和数据库中的很不相同。在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中。例如pvs表中包含ds和city两个Partition,则对应于ds = 20090801, ctry = US 的HDFS子目录为/wh/pvs/ds=20090801/ctry=US;对应于 ds = 20090801, ctry = CA 的HDFS子目录为/wh/pvs/ds=20090801/ctry=CA。分区表简示例
    创建数据文件:test_partition_table.txt
    创建表:create table test_partition_table (key string) partitioned by (dt string)
    加载数据:LOAD DATA INPATH ‘filepath’ INTO TABLE test_partition_table partition (dt=‘2006’)
    查看数据:select * from test_partition_table; select count(*) from test_partition_table
    删除表:drop table test_partition_table
  3. 桶 。Buckets是将表的列通过Hash算法进一步分解成不同的文件存储。它对指定列计算hash,根据hash值切分数据,目的是为了并行,每一个Bucket对应一个文件。例如将user列分散至32个bucket,首先对user列的值计算hash,对应hash值为0的HDFS目录为/wh/pvs/ds=20090801/ctry=US/part-00000;hash值为20的HDFS目录为/wh/pvs/ds=20090801/ctry=US/part-00020。如果想应用很多的Map任务这样是不错的选择。 桶的简单示例:
    创建数据文件:test_bucket_table.txt
    创建表:create table test_bucket_table (key string) clustered by (key) into 20 buckets
    加载数据:LOAD DATA INPATH ‘filepath’ INTO TABLE test_bucket_table
    查看数据:select * from test_bucket_table; set hive.enforce.bucketing = true;
  4. Hive的视图。视图与传统数据库的视图类似。视图是只读的,它基于的基本表,如果改变,数据增加不会影响视图的呈现;如果删除,会出现问题。如果不指定视图的列,会根据select语句后的生成。示例:
    create view test_view as select * from test
    1.4 Hive和数据库的异同:
    由于Hive采用了SQL的查询语言HQL,因此很容易将Hive理解为数据库。其实从结构上来看,Hive和数据库除了拥有类似的查询语言,再无类似之处。数据库可以用在Online的应用中,但是Hive是为数据仓库而设计的,清楚这一点,有助于从应用角度理解Hive的特性。Hive和数据库的比较如下表:
  5. hadoop内的hive hadoop hive_Hive_02

  6. 3、Hive架构
    用户接口 :命令行接口CLI、客户端接口Client 、WebGUI接口WUI
    元数据存储:通常在关系型数据库之内
    解释器、编译器、优化器、执行器
    Hadoop:HDFS用来进行MapReduce分布式计算
    解释:
    CLI命令行接口最常用,启动的时候会打开一个副本
    Client 是 Hive 的客户端,用户连接至 Hive Server。在启动 Client 模式的时候,需要指出 Hive Server 所在节点,并且在该节点启动 Hive Server
    WUI是浏览器访问Hive,一般很少使用,第一次使用的时候可能要部署网站。
    Hive的元数据(比如表信息等)存储在关系型数据库如Derby、Mysql数据库,但是它的真实数据存储在HDFS文件系统之上,大部分操作都有MapReduce来执行。
    图解Hive的架构和运行流程请打开网址(点击打开链接)
    4、Hive的安装
    Hive有三种模式(内嵌模式、本地模式、远程模式)详细的安装方法请参照该博客(点击打开链接)

5、Hive的数据类型
•基本类型:整数型、浮点型、布尔型、字符串型
•复杂数据类型:数组型、集合型、结构型
•时间型:Date、timestamp
下面我具体举几个建表例子,来看一下Hive的一些数据类型

----------array型---------------------------------------
create table student(
id int,
name string,
grade array<double>
)

------------map型----------------------------

create table student1(
id int,
name string,
grade map<string,float>
)

-------------复杂array型--------------------------

create table student2(
id int,
name string,
grade array<map<string,double>>
)

--------------复杂结构型------------------

create table student3(
id int,
massage struct<name:string,id:int,grade:map<string,float> >
)

6、Hive中表的分类
内部表
外部表
分区表
桶表
内部表:什么是内部表需要对比外部表来看
•删表时数据和表一起删除

外部表:
•数据已经存在于HDFS
•外部表只是走一个过程,加载数据和创建表同时完成,不会移动到数据仓库目录中,仅仅是和数据建立了一个连接
•删表数据不会删除数据

内部表外部表区分:
在导入数据到外部表,数据并没有移动到自己的数据仓库目录下,也就是说外部表中的数据并不是由它自己来管理的!而内部表表则不一样;在删除内部表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!

分区表:
•在Hive Select查询中,一般会扫描整个表内容,会消耗很多时间做没必要的工作。 分区表指的是在创建表时,指定partition的分区空间。扫描时可以只扫描某一个分区的数据
•分区表存储时分局所设立的分区分别存储数据(分区字段就是一个文件夹的标识)

桶表
•对于每一个表(table)或者分区,Hive可以进一步组织成桶,也就是说捅是更为细粒度的数据范困划分。
•桶表是对指定的分桶的列进行哈希运算,运算结果模(%)分桶的数量然后把数据根据运算结果分别放入这几个桶中

下面写几个建表小例子来对比一下

----------内部表---------------------------------------

create table student(
id int,
name string,
grade array<double>
)

-------------分区表---------------------

create table p_t(
id int,
age int
)partitioned by (gender string)
row format delimited fields terminated by ','

------外部表----------------------------------------------------------

create external table e_t(
id int,
name string,
age int) row format delimited fields terminated by ',' location '/lws/' --注意这里'/lws/'为HDFS上面的文件所在目录

--------桶表-----------------------------------------------------------------------

create table b_t(
id int,
name string,
age int
)clustered by (name) into 5 buckets row format delimited fields terminated by ','