hive简介
为什么产生 hive?
- MapReduce 提供了通用的分布式开发能力,但是是一个通用的计算引擎,对于一些特殊的数据处理效率较低。比如常见的结构化数据用 SQL 处理,但是数据达到某个量级后单机数据库无法承受,势必要转向大数据平台,而大数据平台有自己单独的计算引擎,所以之前所有使用 SQL 编写的任务需要重构为 MapReduce 任务,但是这个工作量很大,因此可以将 SQL 自动转化为 MapReduce 任务。
- hive 核心思想是将 HDFS 中的结构化数据映射为一张数据库表,并提供 SQL查询、功能分析,支持 SQL任务/MapReduce任务 间的转换。但是转换支持率仅有 60%。
Hive 的组成:
- Client:Hive 客户端,包含 Shell客户端 Beeline、Hive Cli、JDBC客户端;
- Driver:对提交的任务进行解析,将 HiveSQL 转换为 MapReduce 作业。
- Driver 包含解释器、编译器、优化器、执行器,共同完成 HQL 查询语句从语法分析、编译成逻辑查询计划、优化以及转换成物理查询计划的过程;
- 转换时,SQL处理结构化数据,hive数据以文件形式保存,所以需要将文件映射为二维表结构;
- MetaStore 存储了元数据信息(表类型、属性、字段、权限等)用来辅助完成数据映射功能,一般使用 MySQL/Derby 作为数据存储。
- 最终转换后的 MapReduce 任务提交到 Hadoop 平台上进行计算并返回结果。
Hive 三种部署模式
-
本地模式:
-
单用户模式:
-
多用户模式、远程服务器模式:
Hive 核心配置
hive 核心配置文件包括 hive-env.sh
、hive-site.xml
,其中 hive-site.xml
为全局配置文件,进行基础调优配置。
hive-site.xml
中重要的配置:
<configuration>
<!-- 配置 MySQL url地址 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node02:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<!-- 配置Driver驱动 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<!-- 配置UserName -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>username to use against metastore database</description>
</property>
<!-- 配置Password -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>DBa2020*</value>
<description>password to use against metastore database</description>
</property>
.....
.....
<!-- 配置 Thrift 序列化服务的 host、port -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>node03</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://node03:9083</value>
</property>
</configuration>
hive-env.sh
中重要的配置,定义 jdk路径、hadoop根路径、hive配置文件地址:
export JAVA_HOME=/usr/java/jdk1.8.0_191
export HADOOP_HOME=/opt/app/hadoop-2.10.2
export HIVE_CONF_DIR=/opt/app/apache-hive-2.3.7-bin/conf
hive 数据类型/存储格式
hive 表存储格式
TextFile
:文本格式的表,默认以明文的文本方式存储,在存储时使用行式存储,并且默认不进行压缩。- 在计算压缩文件时,如果支持拆分可以 Split 成多个文件,从而启动多个 Map 任务并发处理;但是
TextFile
压缩后在处理时无法进行 Split,所以并发度并不高; TextFile
适用于字段较少或者经常需要获取全字段数据的场景,使用TextFile
可以很方便将数据导入到 Hive 或者导出到外部数据库的中专表中。
- 在计算压缩文件时,如果支持拆分可以 Split 成多个文件,从而启动多个 Map 任务并发处理;但是
SequenceFile
:同样是行式存储的表,但是存储二进制数据,比如 MapReduce 中数据读入和写出时使用的<Key、Value>
数据,其中 Key 作为读取数据的数据行偏移量,Value 存储真正的数据。SequenceFile
支持压缩,并且可以选择None、Record、Block
三种压缩方式,默认为Record
,支持压缩文件再拆分。- 生产中如果需要数据进行行式存储、原生支持压缩,并且满足一定的性能要求。
RCFile/ORC/Parquet
:这三种均为列式存储表。在存储时首先会按照行数进行切分,切分为不同的数据块进行存储(行存储);在每一个数据块中存储时又是列式存储,将表的每一列数据存放在一起,性能更高。- 在处理结构化数据时,一般不会用到全部数据,而是选择某几列进行运算,使用行式存储读取数据时会读数据然后过滤;而列式存储只会读取这几列数据,减少数据读取、处理需要的时间。
ORC
是 hive 计算的主要形式,支持NONE、Zlib、Snappy
压缩方式,并且可以开启事务功能,以便支持数据更新、删除等操作,但事务的开启会影响表的处理性能,所以非必要情况下不需要启用事务功能。ORC
表的问题在于,它是Hive特有的存储类型,所以在其它大数据产品中兼容性并不好,有些只有在较高的版本中才会支持。
Parquet
表也是Hive计算的主要表形式,它的计算性能稍弱于ORC表,但因为Parquet文件是Hadoop通用的存储格式,所以对于其它大数据组件而言,具有非常好的数据兼容度;Parquet
表可以支持数据的多重嵌套(如JSON的属性值可以是一个对象,且支持嵌套),但ORC
表在多重嵌套上的性能并不好。Parquet
支持uncompressed\snappy\gzip\lzo压缩,其中lzo压缩方式压缩的文件支持切片;而ORC表的压缩方式不支持切分,如果单个压缩文件较大的话,性能会有影响。
AVRO
:主要为 Hadoop 提供数据序列化和数据交换服务,支持二进制序列化方式,与 Thrift 功能类似。在数据传输中,不会直接将文本发送出去,而是先要经过序列化,然后再进行网络传输,AVRO就是Hadoop中通用的序列化和数据交换标准。
生产环境中,一般使用较多的是 TextFile、ORC、Parquet
。
TextFile
一般作为数据导入、导出的中转表。ORC、Parquet
作为分析运算的主要表类型,如果需要支持事务,使用 ORC;如果需要兼容性,使用Parquet
;
压缩方式
bzip2
、lzo
支持压缩后文件再拆分;- 这几种压缩算法,按照压缩比的排名为
bzip2 > gzip > deflate > snappy > lzo
;压缩解压缩速度排名正好相反。
hive 数据类型
数值型
- tinyint; 1字节(-128 ~ 127)
- smallint;2字节(-32768 ~ 32767)
- int/integer:4字节(Integer.MIN_VALUE, Integer.MAX_VALUE);
- bigint:8字节有符号整数;
- float:4字节单精度浮点数;
- double:8字节双精度浮点数;
- decimal:不可变的、任意精度的、有符号的十进制数;
- numeric:类似于 decimal;
其中 decimal
数据类型可以使用 decimal(precision, scale)
进行创建,precision
为数字(整数+小数)的总长度(默认为10),scale
为小数部分的长度。
-- float 数据类型转换
select CAST(123.56 AS DECIMAL(4,1));
> 123.6
-- 小数部分超过四舍五入
select CAST(123456.5 AS DECIMAL);
> 123457
-- 整数部分超过直接转换为 NULL
select CAST(12345678910.5 AS DECIMAL);
> NULL
-- 转换其它数据类型为 decimal
select CAST('123456789.1234567' AS DECIMAL(20,5));
123456789.12346
字符型
- string:可变长字符串;
- varchar:可变长字符串,最大字符数(1~65535),超过自动截断;
- char:固定长度字符穿。
select CAST("ABCDEFGHIGK" AS VARCHAR(10));
> ABCDEFGHIG
select CAST("ABCDEFGHIGK" AS STRING);
> ABCDEFGHIGK
日期型
- TIMESTAMP:时间戳格式(
YYYY-MM-DD HH:mm:ss.sss
),存储整型、浮点型、字符串类型时间数据; - DATE:日期格式(
YYYY-MM-DD
),只能由 Date、TIMESTAMP、String 类型转换过来; - intervals:处理年、月、日、分、秒 部分的数据。
其他类型
- boolean:布尔;
- binary:二进制字节数组;
- array:一段有序字段,所有字段数据类型相同;
- map:键值对,键的类型必须是原生数据类型,值可以为原生/复杂数据类型;
- struct:理解为结构体,字段数据类型可以不同;
- union:一组数据类型的集合;