一、Hive是什么
根据官网: Apache Hive
注:本文加入了自己的理解,与官网有部分不一致。且本人也只是在学习的路上,不是布道者,可先参阅官网,对照解读。
Hive的官网介绍非常简洁,就以下四句话。
-
Apache Hive 是一个分布式、容错的数据仓库系统,可实现大规模分析。
-
Hive Metastore(HMS)元存储提供了一个元数据的中央存储库,可以轻松分析以做出信息数据驱动的决策,因此它是许多数据湖架构的关键组成部分。
-
Hive建立在Apache Hadoop之上,通过hdfs支持S3,adls,gs等存储。
-
Hive 允许用户使用 SQL 读取、写入和管理 PB 级数据。
咱一条一条来看。
首先第一条 ,非常好理解,介绍了Hive的特性:分布式、容错、大规模 ,同时也声明了自己是个数据仓库。至于什么是数据仓库 ,数据仓库与数据库有什么区别,这个后面会单独开一篇文章介绍。
第二条 主要需要了解什么是元数据。了解了之后就能明白元数据其实起到了一个数据管理的功能,
Hive的元数据是指描述Hive中的数据表的数据,包括表的结构、分区方式、存储路径、表的基本信息等。
元数据是Hive的核心组成部分,起到了类似索引的功能,在Hive中可以通过操作元数据来进行SQL查询优化,以达到更好的性能。
第三条中S3、ADLS和GS是指存储类型。Hive可以连接到这些存储类型,以便用户能够使用SQL(结构化查询语言)读取、写入和管理PB级数据(即大量数据,通常指规模达到PB级别或更大的数据集)。
其中:
- S3:Amazon S3(简单存储服务)是一个云存储服务,可以在互联网上存储和访问大量数据。
- ADLS:Azure Data Lake Storage(Azure数据湖存储)是Microsoft的云存储服务,用于存储PB级数据。
- GS:Google Cloud Storage(谷歌云存储)是Google的云存储服务,用于在Google Cloud上存储大量数据。
第四条中Hive是一个工具,可以用来处理存储在各种云存储服务中的大量数据,而无需直接使用这些服务的特定查询语言或API。用户可以使用他们熟悉的SQL语言来处理这些数据。
所以,总结来看,官网主要介绍了Hive的特点:
- 大数据标准特点:分布式,容错,大规模
- 数据管理能力
- 数据存储类型兼容
- 兼容sql,查询便捷
二、Hive 为什么出现
2.1. Hive的局限性
Facebook每天产生大量的结构化日志数据,急需一种工具来管理和分析这些数据,他们把目光投向了hadoop,HDFS确实很好用解决了大数据的存储问题。
但是,对于日志数据的处理,传统的MapReduce程序在编写复杂的分析查询时非常繁琐。之前的文章我们也提到过MapReduce的一些局限性:缺乏灵活性 以及对于复杂任务的编码复杂性。
开始,FaceBook在没有其他替代品的情下当然选择忍了。但是,积年累月下来FaceBook团队发现MapReduce这玩意儿的格式非常固化,所有的任务基本上都是在map,reduce两个阶段无限魔改。
好了,现在已知条件:
- MapReduce编写非常繁琐,但是格式相对固化。
- SQL格式也很固化,两者有很大可能可以相互映射。
- SQL入门非常简单。
由此,FaceBook就萌生了想要以SQL指令的形式替代MapReduce的想法。
2.2. Hive的解决方案
首先,想要以SQL执行MapReduce就要搞要明白SQL的基础不是select from where
,而是数据库中高度规范化的表结构。
所以,Hive想要以SQL形式去处理分析HDFS的中的数据文件,首先要做的是把结构化的数据文件(如csv,json)映射为一张数据库表。
大数据嘛,数据肯定茫茫多,这个时候数据管理就非常有必要了。Hive的 Hive Metastore(HMS)元存储提供了一个元数据的中央存储库。元数据不仅可以起到数据管理的作用,同时可以对SQL查询进行优化。
接下来,有了类数据表的格式,只需要通过MapReduce实现select from where
等逻辑就可以用SQL来执行MapReduce。
总结来说,Hive是为了简化MapReduce程序而生成的一种数据仓库工具。
2.3. Hive的优势
-
Hive可以将结构化的数据文件映射为一张数据库表,可以快速构建数据仓库。
-
Hive提供了一种用户编程接口,提供了类SQL的查询语言HQL(Hive Query Language),使得熟悉SQL语言的开发人员可以快速上手。并且Hive可以将HQL转换为MapReduce任务,降低了编写MapReduce的复杂度。
-
Hive的出现也使得Hadoop生态系统更加完善,为大数据分析提供了更加便捷的工具。
三、Hive架构
3.1. Hive的核心组件:
- 存储层:Hive的底层存储依赖于HDFS,因此它也支持HDFS所支持的数据存储格式,如text、json、parquet等。当我们将一个文件映射为Hive中一张表时,只需在建表的时告诉Hive,数据中的列名、列分隔符、行分隔符等,Hive就可以自动解析数据。
- 元数据:Hive的元数据采用基于关系型数据库的元数据存储方式,通常使用MySQL作为元数据库。元数据包括表的名称、表的列名、列数据类型等信息。
- 查询语言:Hive提供了一种类似于SQL的查询语言HQL(Hive Query Language),用户可以使用HQL进行数据查询、数据转换等操作。
- 执行引擎:Hive的执行引擎可以是MapReduce、Tez或者Spark等,它负责将HQL转换为对应的计算模型并执行。
3.2. 存储层支持的数据文件
Hive的存储层基于HDFS,可以解析多种不同格式的数据文件,主要包括:
-
TEXTFILE - 默认的纯文本文件格式,字段之间用特定分隔符分隔,例如CSV文件。
-
RCFILE - 列式存储格式,可以高效进行查询。
-
ORC - 更优的列式存储格式,比RCFILE有更好的压缩和编码技术。
-
PARQUET - 开源列式存储格式,支持复杂数据结构。
-
AVRO - 基于JSON的序列化数据格式。
-
JSON - 一种半结构化的JSON格式文件。
-
XML - 一种半结构化的XML格式文件。
-
SequenceFile - Hadoop的二进制文件格式,可以跨行存储。
-
常见图片格式 - 如JPG、PNG等,可以解析元数据。
3.2.1 解析csv到Hive表实例
对于把结构化的数据文件映射到 Hive 表,有以下几个步骤:
-
准备结构化的CSV数据文件,上传到 HDFS。
-
创建 Hive 表,指定字段名和类型。例如:
sql
CREATE TABLE data_table (
id INT,
name STRING,
age INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
- 指定数据文件位置,装载到 Hive 表中。
sql
LOAD DATA INPATH '/user/data/data.csv' OVERWRITE INTO TABLE data_table;
- 通过 SELECT 查询 Hive 表,就可以读取数据文件中的数据了。
sql
SELECT * FROM data_table;
重点是创建表时,要指定字段和类型,使用行列格式描述文件格式,最后指定数据文件位置进行加载。Hive 会按照表结构来映射数据文件,这样就可以用 SQL 查询数据文件中的数据了。
3.2.2 解析json到Hive表实例
- 创建Hive表,指定列名和数据类型。注意JSON文件中字段是嵌套的,需要按照JSON结构flatten:
sql
CREATE TABLE json_table (
id BIGINT,
name STRING,
age INT,
address STRUCT<city:STRING, street:STRING>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
- 指定JSON的数据文件位置,装载数据:
sql
LOAD DATA INPATH '/user/data/data.json' INTO TABLE json_table;
- 查询解析后的数据:
sql
SELECT * FROM json_table;
Hive中通过指定SerDe为org.openx.data.jsonserde.JsonSerDe,可以完成从JSON文件到Hive表的解析。需要注意的是JSON中的嵌套字段需要flatten为Hive的列。
所以正确定义Hive表结构是解析JSON的关键。另外,也可以不定义表结构,直接用JsonSerDe读取JSON文件,再使用get_json_object等函数解析。
3.3.HSQL与MapReduce的转化
3.3.1.HSQL执行顺序
在hive中执行sql语句的执行查询顺序:
sql
select ...
from ...
where ...
group by ...
having ...
order by ...
执行顺序:
sql
from ...
where ...
select ...
group by ...
having by ...
order by...
3.3.2.对应MR程序的执行顺序
Map阶段
1.执行from加载,进行表的查找与加载;
2.执行where过滤,进行条件过滤与筛选;
3.执行select查询:进行输出项的筛选;
4.map端文件合并:当数据表非常大的时候,必然需要多个map和多个reduce来进行操作.
在map端已经把所有将所有涉及的表中相关字段中符合条件的内容全部筛选出来了。
Reduce阶段
reduce阶段:map端本地溢出文件的合并操作,每个map最终形成一个临时文件。然后按照列映射到对应的reduce。
在进行map阶段后之后我们会形成一张逻辑表,reduce阶段在这表中做分组排序等操作
1.group by:对map端发送过来的数据进行分组并进行计算;
2.having:最后过滤列用于输出结果;
3.order by:排序后进行结果输出到HDFS文件;
总结:Hive的优缺点
Hive的优点:
- 分布式,高容错、易拓展:Hive是基于HDFS和MapReduce的分布式系统,可以轻松扩展集群存储和运算的规模。同样的因为Hadoop的高容错,Hive也就是高容错的。
- SQL类似语法:Hive的HQL语言与SQL类似,使得熟悉SQL语言的开发人员可以快速上手。
Hive的缺点:
- 查询延迟较大:由于Hive是将HQL转换为MapReduce任务进行执行的,因此查询的延迟较大,不适合实时数据分析。
- 不适合处理增量数据:Hive适合处理大规模静态数据,对于实时产生的增量数据不太适用。
- 数据质量要求高:由于Hive采用批量处理的模式,对于数据的质量和一致性要求较高。
总的来说,Apache Hive是一个适用于大规模结构化数据分析的数据仓库工具,它的分布式架构和类似于SQL的查询语言使得大规模数据的处理变得容易。然而,它也存在一些缺点,如查询延迟较大、不适合处理增量数据等。因此,在实际应用中,需要根据具体场景和需求来选择是否使用Hive进行分析工作。