- 1、Hive产生背景
- 2、hive的来源
- 3、Hive本质
- 4、Hive能实现什么功能?
- 5、Hive内部怎么处理数据
- Hive文件存储格式
- Hive各种文件存储格式的特点与区别 - 6、Hive不适用于什么场景
- 7、Hive适用于什么场景
- 8、Hive怎么分析数据
- 9、Hive整体架构图
- 10、Hive的数据类型
一、Hive产生背景
Apache Hive 数据仓库软件可以使用SQL方便地阅读、编写和管理分布在分布式存储中的大型数据集。结构可以投射到已经存储的数据上。提供了一个命令行工具和JDBC驱动程序来将用户连接到Hive。
- 由Facebook开源,最初用于解决海量结构化的日志数据统计问题
- MapReduce编程的不便性
- HDFS上的文件缺少Schema(字段名,字段类型等)。
二、hive的来源
Hive本是Hadoop的子项目,被设计为使用HPL-SQL语言(简称HQL)来分析大量数据,旨在降低分析大量程序的难度,后来在Apache软件基金会顺利毕业,成为Apache中的一个顶级项目。
三、Hive本质
Hive是一个由java语言编写的应用程序,能够将HPL-SQL语言写就的语句翻译成MR(或者其他底层执行引擎)程序,HPL-SQL语言跟传统的标准SQL类似,其中描述数据的方式也是数据库与数据表,只不过在Hive中,数据库表与常见的关系型数据中的库表不同。
在这里插入图片描述
四、Hive能实现什么功能?
Hive构建于Apache Hadoop™之上,提供以下功能:
通过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内部怎么处理数据
1、文件格式
Hive存储数据的时候没有一种“Hive”格式。Hive附带内置连接器,用于逗号和制表符分隔值(CSV / TSV)文本文件,Apache Parquet™, Apache ORC™和其他格式。
用户可以使用其他格式的连接器扩展Hive。
2、各文件格式特点与区别
-
1)、TestFile
TextFile文件不支持块压缩,默认格式,数据不做压缩,磁盘开销大,数据解析开销大。这边不做深入介绍。 -
2)、RCFile
Record Columnar的缩写。是Hadoop中第一个列文件格式。能够很好的压缩和快速的查询性能,但是不支持模式演进。通常写操作比较慢,比非列形式的文件格式需要更多的内存空间和计算量。
RCFile是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读.
取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。 -
3)、ORCFile
存储方式:数据按行分块、每块按照列存储 、压缩快、快速列存取,效率比rcfile高,是rcfile的改良版本,相比RC能够更好的压缩,能够更快的查询,但还是不支持模式演进。
- 4)、Parquet列式存储
Parquet能够很好的压缩,有很好的查询性能,支持有限的模式演进。但是写速度通常比较慢。这中文件格式主要是用在Cloudera Impala上面的。
六、Hive不适用于什么场景
Hive不适用于联机事务处理(OLTP)工作负载。
七、Hive适用于什么场景
它最适用于传统的数据仓库任务。
Hive旨在最大限度地提高可扩展性(通过向Hadoop集群动态添加更多计算机来扩展),性能,可扩展性,容错性以及与其输入格式的松散耦合。
Hive的组件包括HCatalog和WebHCat。
HCatalog是Hive的一个组件。它是Hadoop的表和存储管理层,使具有不同数据处理工具(包括Pig和MapReduce)的用户能够更轻松地在网格上读取和写入数据。
WebHCat提供的服务可用于运行Hadoop MapReduce(或YARN),Pig,Hive作业或使用HTTP(REST样式)接口执行Hive元数据操作。
八、Hive怎么分析数据
回想一下,我们使用Mapreduce处理应用程序时,针对每一行数据,我们都需要使用数据内所设置的特定分隔符,将一行文本分隔成多个列,然后再对多个列处理。例如,我们MR的入门程序wordcount,就是一个典型的group by + count的操作。同样的,Hive既然要将sql语句翻译成MR执行,就需要“知道”数据的长相——即数据的结构信息,这些信息在Hive内部被称之为元数据(注意,HDFS上的数据本身的元信息是指数据的创建者、创建时间、权限、数据大小等信息),Hive将元数据信息放置到常用的关系型数据库中,这样可以加快Hive分析数据的速度。
在Hive中也有库、表的概念,我们也可以往表中添加数据并进行统计分析,且除了select * 操作以外都转换成了MR去执行。同样的,我们也看到很多操作与mysql相比并不完全相同,甚至大相径庭,是的,Hive本质还是一个数据分析工具,而不是一个传统意义上的数据库软件,所以怎样在Hive内高效的分析数据是我们学习的重点,接下来,我们会通过对Hive的库表的操作来学习使用Hive对大量数据的分析。
九、Hive整体架构图
Hive的客户端
由上述架构图可知,Hive中的客户端有多种类型,最常见的就是我们上述的由hive命令打开的hiveshell客户端,称之为HiveCLI,其本质是一个基于JDBC的Hive连接客户端。
HiveServer2(在Hive 0.11中引入)有自己的名为Beeline的CLI ,它是一个基于SQLLine的JDBC客户端。由于新开发的重点是HiveServer2,Hive CLI很快就会被弃用,但是现在还能使用。
HiveCLI与Beeline的区别如下:
HiveCLI(命令行方式)即通过hive进入命令模式后通过执行不同的HQL命令得到对应的结果;相当于胖客户端模式,即客户机中需要安装JRE环境和Hive程序。
beeline客户端方式相当于瘦客户端模式,采用JDBC方式借助于Hive Thrift服务访问Hive数据仓库。
Beeline工作模式有两种,即本地嵌入模式和远程模式。嵌入模式情况下,它返回一个嵌入式的Hive(类似于Hive CLI)。而远程模式则是通过Thrift协议与某个单独的HiveServer2进程进行连接通信。
HiveCLI显示的信息一般不如beeline显示的丰富。
HiveThrift(HiveServer)是Hive中的组件之一,设计目的是为了实现跨语言轻量级访问Hive数据仓库,有Hiveserver和Hiveserver2两个版本,两者不兼容。
beeline的简单使用方式如下:
- 先在安装hive的机器上以后台启动的方式启动hive的server2
nohup hive –service hiveserver2 & - 检测启动情况
ps -ef | grep Hive - 使用beeline客户端连接hiveserver2
beeline -u jdbc:hive2://
注意:上述方式需要beeline也在hive安装的主机上执行,如果需要连接到其他hiveserver2则需要很多其他安全校验方面的配置,我们这里就不涉及了。
Hive的操作
从大的层面来看,Hive的所有操作可以分为以下两种:
- Hive Data Definition Language 简称Hive的DDL,即Hive数据定义语言——用来增删查改库、表结构
- Hive Data Manipulation Language 简称Hive的DML,即Hive数据操作语言——用来增删改查表内数据
最重点的当属DML中的查询,其是用来分析数据的关键。但是其他部分也是使用Hive必不可少的,所以也需要我们掌握。
Hive的库
库的本质
mysql中,库的本质是一个逻辑概念,即包含一堆表的实体。跟java语言中的包的概念类似。在Hive中,库的本质就是HDFS上的一个目录,其内含有表和表内数据。我们在hive中创建库时,默认会在hive仓库目录(默认为hdfs上的/user/hive/warehouse目录)中创建一个”库名.db”的文件夹。hive默认的库名为default,位置就是/user/hive/warehouse。
我们能够对库做的所有操作,都是DDL操作。
十、Hive的数据类型
数值类型
TINYINT(1字节有符号整数,从-128至127)
SMALLINT(2字节有符号整数,从-32,768至32,767)
INT / INTEGER(4字节有符号整数,从-2,147,483,648到2,147,483,647)
BIGINT(8字节符号整数,从-9,223,372,036,854,775,808至9,223,372,036,854,775,807)
FLOAT (4字节单精度浮点数)
DOUBLE (8字节双精度浮点数)
DOUBLE PRECISION ( DOUBLE的别名,仅从 Hive 2.2.0开始提供)
DECIMAL
DECIMALHive中的类型基于Java的BigDecimal,用于表示Java中不可变的任意精度十进制数。
在Hive 0.11.0中引入,精度为38位
Hive 0.13.0引入了用户可定义的精度和规模
用户可以DECIMAL使用DECIMAL(precision, scale)语法在使用数据类型创建表时指定比例和精度。如果未指定scale,则默认为0(无小数位)。如果未指定precision(精度),则默认为10。
NUMERIC(同样DECIMAL,从Hive 3.0.0开始)
日期/时间类型
TIMESTAMP(注意:仅从 Hive 0.8.0开始提供)
时间戳被解释为无时区并存储为UNIX纪元的偏移量
DATE(注意:仅从 Hive 0.12.0开始提供)
DATE值以形式描述特定的年/月/日YYYY-MM-DD。例如,DATE’2013-01-01’。日期类型没有时间组件。Date类型支持的值范围是0000-01-01到9999-12-31
INTERVAL(注意:仅从Hive 1.2.0开始提供)
字符串类型
STRING
字符串文字可以用单引号(’)或双引号(“)表示
VARCHAR(注意:仅从 Hive 0.12.0开始提供)
使用长度说明符(介于1和65535之间)创建Varchar类型,该长度说明符定义字符串中允许的最大字符数。
CHAR(注意:仅从 Hive 0.13.0开始提供)
Char类型与Varchar类似,但它们是固定长度的,最大长度固定为255。
杂项类型
BOOLEAN
BINARY(注意:仅从 Hive 0.8.0开始提供)
复杂类型
ARRAY
ARRAY<data_type>注意:从Hive 0.14开始,允许使用负值和非常量表达式 。
map
MAP<primitive_type, data_type>注意:从Hive 0.14开始,允许使用负值和非常量表达式。
STRUCT
STRUCT<col_name : data_type [COMMENT col_comment], …>
union
( UNIONTYPE<data_type, data_type, …>注意:仅从 Hive 0.7.0开始提供。)