1. 什么是Hive?
Hive是从HDFS中读、写以及管理海量数据的数据仓库,是强大的Hadoop系统的一个方面。
2. Hive的发展历史
Hive是由Joydeep Sen Sarma,Ashish Thusoo共同构思的一个开源项目,Hive开始时是作为Hadoop的子项目,但是随着发展,Hive已经发展成了它自己的顶级项目。
随着 Hadoop 和 Map Reduce 作业的局限性越来越大,数据量也从 2006 年的每天 10 GB 增加到 1TB/天,并在几年内增加到 15TB/天。 Facebook 的工程师无法轻松运行复杂的作业,让位于 Hive 的创建。
Apache Hive 的创建是为了实现两个目标——一种基于 SQL 的声明性语言,它还允许工程师在 SQL 不够用时插入他们自己的脚本和程序,这也使大多数工程界(基于 SQL 技能)能够以最少的中断或再培训来使用 Hive。其次,它为组织中的所有数据集提供了一个集中的元数据存储(基于 Hadoop)
3. Hive的特性
- Hive支持对存储在多种不同文件操作系统(HDFS/Amazon S3/Azure Blob Storage/Azure Data Lake Storage/Google Cloud Storage/Alluxio)的数据进行数据分析。
- Hive自己实现了一套类SQL的查询语言(HiveQL),具有读写模式,透明地将查询转化为Apache Spark,MapReduce以及Apache Tez作业。
- Hive提供了查询和处理数据的功能函数。这些功能包括:字符串操作、日期操作、类型转化、条件运算符、数学函数等等。
- 关系数据库管理系统中的元数据存储
- 不同的存储类型,如 Parquet、纯文本、RCFile、HBase、ORC 等
- 使用算法对存储在 Hadoop 生态系统中的压缩数据进行操作
- 内置用户定义函数 (UDF),用于处理日期、字符串和其他数据挖掘工具。 Hive 支持扩展 UDF 集以处理内置函数不支持的用例
4. Hive架构以及关键组件
Hive架构中的关键组件有:Hive Server2, HQL, Hive Metastore, Beeline shell。
4.1 Hive Server2
Hive Server2 接受用户和应用的请求来创建执行计划,并且自动生成一个YARN任务来处理SQL查询。Hive Server2 还支持Hive优化器和Hive编译器来简化数据的提取和处理。
4.2 HQL(Hive Query Language)
通过启用SQL记忆代码的实现,Apache Hive 不再需要冗长的 JavaScript 代码来对非结构化数据进行排序,并允许用户使用内置的 HQL 语句 (HQL) 进行查询,这些语句可用于以经济高效的方式导航大型数据集、优化结果和共享数据。
4.3 Hive元存储
HiveMetastore是Hive基础架构的中央存储库,Metastore用来存储Hive所有的元数据。在 Metastore 中,还可以将元数据格式化为 Hive 表和分区,以便跨关系数据库比较数据。这些元数据包含:表名、列名、数据类型、分区信息以及在HDFS系统中的存储位置。
4.4 Beeline Shell
Hive像其他的DBMS(Database Management System)一样,拥有让用户执行HQL的命令行接口Beeline。Hive Shell(Beeline)可以运行JDBC/ODBC驱动器,以便用户可以从开放式数据库以及Java数据库连接应用程序进行查询。
5. Hive的工作流程
HiveServer2接受用户或者应用发来的请求,根据请求创建执行计划且自动生成YARN task 来处理SQL查询。这个YARN task 可能是Spark,Tez,MapReduce。
这些task作为Hadoop的分布式应用来运行。一旦SQL查询被执行完成,其结果将会直接传给端用户、应用或者传回HDFS。
然后,Hive Metastore 将利用 Postgres 或 MySQL 等关系数据库来保存此元数据,Hive Server 2 检索表结构作为其查询计划的一部分。 在某些情况下,应用程序还可能会在其底层处理过程中询问元存储。
Hive的工作负载以YARN任务的方式启动,Hadoop的资源管理器提供了一个可以执行Hadoop任务的执行环境。这个执行环境由Hadoop集群中的多个节点分配的内存和CPU组成。
YARN 将尝试利用 HDFS 元数据信息来确保在所需数据所在的位置部署处理,MapReduce、Tez、Spark 或 Hive 可以自动生成 SQL 查询代码作为 MapReduce、Tez 或 Spark 作业。
尽管 Hive 最近才利用 MapReduce,但大多数 Cloudera Hadoop 部署都会将 Hive 配置为使用 MapReduce,有时甚至是 Spark。 Hortonworks (HDP) 部署通常将 Tez 设置为执行引擎。
6. Hive五种不同的数据类型
通过批处理,Hive能够有效提取以及快速处理PB级数据。---> 似的Hive不仅仅能够处理数据,也可以用来临时查询(ad hoc queries)。
6.1 数值数据类型(Numeric Data Types)
数值数据类型是基于整数的数据类型,包含:TINYINT, SMALLINT, INT, and BIGINT.
6.2 时间日期数据类型(Date/Time Data Types)
这些数据类型允许用户输入时间和日期,TIMESTAMP, DATE, and INTERVAL都是可接受的输入。
6.3 字符串数据类型(String Data Types)
字符串数据类型包括STRING, VARCHAR and CHAR.
6.4 复杂数据类型(Complex Data Types)
作为更高级的数据类型之一,复杂类型记录更精细的数据,包括STRUCT, MAP, ARRAY and UNION等类型。
6.5 杂项类型(Misc. Types)
不属于其他四个类别的数据类型称为杂项数据类型,可以采用BOOLEAN or BINARY等输入。
7. Map Join在Hive中是如何工作的?
Map Join是Hive的一个功能,通过组合或者连接两个表中的数据来提高查询的速度和效率,绕过Map-Reduce的处理阶段。
8. 什么是关系数据库管理系统以及Hive如何使用它?
RDBMS(Relational Database Management System)是一个数据库模型,它将元数据存储在二维表中来操作,并允许连接和比较不同的数据集。
通过使用 RDBMS,Apache Hive 可以确保安全、可靠和准确地存储和处理所有数据,因为基于角色的安全性和加密通信等集成功能确保只有正确的人才能访问提取的信息。
Hive和一个普通的RDBMS的区别?
- RDBSM多次读写;Hive一次写入,多次读。
- Hive 遵循 schema-on-read 规则,只是意味着没有数据验证、检查或解析,只是复制/移动文件;在传统的数据库中,架构应用于表,该表在写入规则上,强制执行架构。
- Hive项目构建于Hadoop之上,必须遵守与Hadoop和Map-Reduce相同的限制,而传统的数据库却没有这些规则和限制。
Hive vs. Spark
Apache Spark是一个分布式的数据处理和分析框架,旨在处理各种数据集中的大量数据,它提供了一个强大的用户界面,能够支持从 R 到 Python 的各种语言。
Hive 提供了一个抽象层,将数据表示为具有行、列和数据类型的表,以便使用称为 HiveQL 的 SQL 接口进行查询和分析。Apache Hive 支持使用 Hive LLAP 的 ACID 事务。 在多个用户/进程同时访问数据以进行创建、读取、更新和删除 (CRUD) 操作的环境中,事务保证数据的一致视图。
Hive vs. Presto
PrestoDB 最初成立于 Facebook 的一个项目,通常称为 Presto,是一个分布式 SQL 查询引擎,允许用户以极快的速度处理和分析 PB 级数据。 Presto 的基础架构支持从 MySQL 和 Teradata 到 MongoDB 和 Cassandra 的关系数据库和非关系数据库的集成。