一、Hive概述
Hive是一个在Hadoop中用来处理结构化数据的数据仓库基础工具。它架构在Hadoop之上,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。
Hive数据仓库工具能为HDFS上的数据提供类似SQL的查询语言(HiveQL),并将SQL语句转变成MapReduce任务来执行。Hive 明显降低了 Hadoop 的使用门槛,任何熟悉 SQL 的用户都可以使用 Hive。
Hive 经常用于业务和数据分析,并对存储在 HDFS 上的数据执行特殊查询。
二、Hive基本使用
Hive 的使用通常分为以下三个步骤:
- 创建表,定义表的各个字段
- 把数据导入已创建的表中
- 针对上表执行 HiveQL 查询
1.创建表
创建表的语法与 SQL 基本一致
CREATE TABLE ufodata(
sighted string,
reported string,
sighting_location string)
ROW FORMAT DELIMITED
FIFLDS TERMINATED BY '\t';
这里要注意,由于 Hive 通常从 HDFS 上的文件导入数据,因此要注意文件格式的匹配。
ROW FORMAT DELIMITED 告诉 Hive 每行数据包含多个有界字段,
FIFLDS TERMINATED BY 指定了文件的分隔符
2. 导入数据
- 从 HDFS 上导入数据:如果使用的文件已经在 HDFS 上,可以使用 INPATH 指定源文件位置
如果传给LOAD 的是 HDFS 上的数据路径,那么在导入数据后会删除原始文件
可以使用 LOCAL INPATH 指定位于本地文件系统上的源文件
LOAD DATA INPATH '/tmp/ufo.tsv' OVERWRITE INTO TABLE ufodata;
注意,OVERWRITE 会在导入数据前删除表中原有数据,还会把存放表数据的目录清空
- 基于现有文件创建表:可以导入 Hive 仓库目录之外路径的数据
CREATE EXTERNAL TABLE states(abbreviation string, full_name string)
ROW FORMAT DELIMITED
FIFLDS TERMINATED BY '\t'
LOCATION '/tmp/states';
EXTERNAL 表明该表存在于 Hive 控制之外的位置
LOCATION 指明了源文件或源目录的位置
使用该方式创建表,不会删除原始数据文件,并且在创建表的同时就会把数据插入表中。
- 数据导入原理:Hive 使用上述方式导入数据时,并没有实际把输入数据插入表中各行,而是把数据文件拷入工作路径,以源数据为基础创建了一批元数据,后续进行 HiveSQL查询时,转换成的 MapReduce 作业会使用这些元数据去查询实际的数据。
3. 其他功能
HiveSQL 还支持类似于SQL的很多特性,如:
- 视图
- 导出查询结果:
// 将查询结果导出到 /tmp/out 目录
INSERT OVERWRITE DIRECTORY ‘/tmp/out’
SELECT reported, shape, state
FROM usa_sightings
WHERE state = 'XXX';
- 分区:将表按照虚拟列的值进行分区操作。通常用于超大的数据量,最常用的分区策略是使用日期作为分区列
CREATE TABLE partufo(
sighted string,
reported string,
sighting_location string)
PARTITIONED BY (year string)
ROW FORMAT DELIMITED
FIFLDS TERMINATED BY '\t';
指定分区列后,会自动在表结构中自动加入 year 这一字段
后续导入数据时,会自动按照 year 列的值对表进行分区。如果后续使用 HiveSQL 引用某个特定分区,Hive 会执行一次意义非凡的优化——只会处理在相应分区路径下的数据
- 分桶:Hive 还可以使用分桶进一步将数据行聚集到桶中,通过对 CLUSTER BY 指定列使用哈希函数实现;还可以使用 SORT BY 对桶中的数据进行排序。 在数据集非常大时,使用分桶可以显著缩短查询时间
- 自定义函数
4. Hive 和 Pig 的对比
和 Hive 一样,Pig 也避免了直接编写 MapReduce 代码,但是两种方法的抽象方式不同。
Hive 提供类似 SQL 语言的接口,使用方便,只定义执行的操作,而不管如何实现这些操作
Pig 则使用 Pig Latin 语言定义数据流流水线,可以对作业运行方式进行更细粒度的控制。
三、Hive 原理
1. Hive 架构
包含:
- 用户界面、接口
- 元存储:Hive选择各自的数据库服务器,用以储存表,数据库,列模式或元数据表,它们的数据类型和HDFS映射。
- HiveQL处理引擎: HiveQL的Metastore模式信息查询类似于SQL的查询上。这是传统的方式进行MapReduce程序的替代品之一。
- 执行引擎
- HDFS 或 HBASE
2. Hive 工作原理
- Hive接口,如命令行或Web UI发送查询驱动程序(任何数据库驱动程序,如JDBC,ODBC等)来执行。
- 在驱动程序帮助下查询编译器,分析查询检查语法和查询计划或查询的要求。
- 编译器发送元数据请求到Metastore(任何数据库)
- Metastore发送元数据,以编译器的响应。
- 编译器检查要求,并重新发送计划给驱动程序。到此为止,查询解析和编译完成。
- 驱动程序发送执行计划到执行引擎。
- 在内部,执行作业的过程是一个MapReduce工作。执行引擎发送作业给JobTracker至NameNode,并把它分配作业到TaskTracker至DataNode
- 与此同时,在执行时,执行引擎可以通过Metastore执行元数据操作。
- 执行引擎接收来自数据节点的结果。
- 执行引擎发送这些结果值给驱动程序。
- 驱动程序将结果发送给Hive接口。