一、Hive介绍
Hive 是一个构建在 Hadoop 上的数仓工具,用于处理和查询存储在 HDFS 上的大规模数据。它使用类似 SQL 的 HiveQL 来执行查询,但背后是将查询任务转译成 MapReduce、Tez 或 Spark 等分布式计算任务来执行。Hive 的主要优势包括:
- 分布式处理:依赖于 Hadoop 框架,能够并行处理 TB 级以上的数据。
- 高扩展性:通过增加节点扩展存储和计算能力,支持海量数据处理。
- SQL 兼容性:使用 SQL-Like 的查询语言 HiveQL,易于上手和使用。
- 灵活性:支持多种数据格式和存储方式,数据导入导出方便。
- 经济高效:使用廉价的硬件资源即可实现大规模数据计算。
总之,Hive 适用于需要对大规模数据进行批量处理和分析的场景,是处理大数据的强有力工具。
二、Hive架构
用户接口: Client
包括 CLI、JDBC/ODBC、WEBUI。其中:
- CLI:CLI(command line interface)为 shell 命令行;
- 启动 CLI 非常简单,只需要在命令行中输入
hive
命令即可进入 Hive 的交互式命令行界面。在启动 CLI 的同时,也会启动一个 Hive 服务。 - 如:
- 启动 CLI 非常简单,只需要在命令行中输入
- Thrift 服务器:Hive 中的 Thrift 服务器允许外部客户端通过网络与 Hive 进行交互,类似于 JDBC 或 ODBC 协议。
- 启动:
- 前台启动:hive --service hiveserver2
- 后台启动:nohup hive --service hiveserver2 > /var/log/hiveserver.log 2> /var/log/hiveserver.err &
- 启动:
- WEB(Web Graphical User Interface):WebGUI 是通过浏览器访问 Hive。
- Hive 2.2.0 及以后的版本中不再包含 HWI,因此较新的版本无需关注。
元数据: Metastore
元数据包括:表名、表所属的数据库(默认是 default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;其实主要作用就是Hive的表和HDFS的路径做映射。
默认存储在自带的 derby 数据库中,推荐使用 MySQL 存储Metastore。
驱动器: Driver
- 解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST,这一步一般都用第三方工具库完成,比如 antlr;对 AST 进行语法分析,比如表是否存在、字段是否存在、 SQL语义是否有误。
- 编译器(Physical Plan):将 AST 编译生成逻辑执行计划。
- 优化器(Query Optimizer):对逻辑执行计划进行优化。
- 执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于 Hive 来说, 就是 MR/Spark。
三、Hive原理
Hive会提前将SQL语言中常用的操作(select,where,group等)用MapReduce写成很多模板。将模板封装在Hive中。
简单说就是Hive把client输入的SQL转换为Mapreduce,运行在 Yarn 上。
建表,通过映射关系(表和HDFS路径)向表中导数据。
查询,通过表名从Metastore中(记录 MetaStore着表对应文件的path)得到HDFS文件的路径查询对应的数据。
Hive 通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的 Driver,结合元数据(MetaStore),将这些指令翻译(经过解析器、编译器、优化器)成 MapReduce,提交到 Hadoop 中执行,最后,将执行返回的结果输出到用户交互接口。
四、Hive为什么能够处理大量数据?
Hive 是一个建立在 Hadoop 之上的数据仓库系统,它能够处理大量数据主要是因为以下几个原因:
-
分布式存储:Hive 使用 Hadoop 的 HDFS(Hadoop Distributed File System)来存储数据。HDFS 是一个分布式文件系统,它将大文件分割成多个块(block),并将这些块分散存储在集群中的多个节点上。这种分布式存储方式使得 Hive 能够有效地存储和处理大规模数据集。
-
分布式计算:Hive 利用 Hadoop 的 MapReduce 计算框架来执行数据处理任务。MapReduce 将计算任务分解成多个小任务(map 和 reduce 阶段),并在集群中的多个节点上并行执行这些任务。这种分布式计算模型极大地提高了数据处理的效率和吞吐量。
-
SQL 接口:Hive 提供了一个类 SQL 的查询语言——HiveQL,它允许用户通过编写 SQL 风格的查询来分析和处理数据。这使得数据分析师和工程师能够使用熟悉的 SQL 语法来处理大规模数据集,而不需要编写复杂的 MapReduce 程序。
-
可扩展性:Hive 的设计具有很好的可扩展性。随着数据量的增长,可以通过增加更多的计算和存储节点来扩展集群的容量和处理能力。
-
数据抽象:Hive 提供了表(table)和分区(partition)等数据抽象,使得用户可以像操作传统数据库一样操作大规模数据集。这种抽象层简化了数据管理和查询的过程。
-
生态系统支持:Hive 是 Hadoop 生态系统的一部分,它可以与其他 Hadoop 组件(如 Pig、HBase、Spark 等)无缝集成,为用户提供了一个强大的数据处理平台。
关于 Hive 的详细解释和文档,以下是一些比较好的资源:
-
官方文档:Apache Hive 官方文档 提供了 Hive 的全面介绍,包括安装、配置、使用和优化等方面的信息。
-
书籍:《Hive 编程指南》(Programming Hive)是一本详细介绍 Hive 的书籍,适合想要深入了解 Hive 的读者。
-
在线教程和课程:Coursera、Udemy、edX 等在线教育平台上提供了关于 Hadoop 和 Hive 的课程,这些课程通常包括视频讲座、实践练习和项目作业。
-
技术博客和文章:许多技术博客和网站(如 Medium、Towards Data Science 等)上都有关于 Hive 的文章和教程,这些内容通常由经验丰富的数据工程师和分析师撰写,提供了实用的技巧和案例分析。
通过这些资源,你可以更深入地了解 Hive 的工作原理和最佳实践,以及如何有效地使用 Hive 处理大量数据。
五、Hive是如何查询TB级别的数据的?和Mysql对比下
为了更好理解Hive的优势,下面通过一个实际案例对比Hive和MySQL在处理TB级数据时的差异。
数据集简介
假设我们有一个TB级别的销售数据集,该数据集有以下几列:
transaction_id
:交易IDtransaction_date
:交易日期customer_id
:客户IDproduct_id
:产品IDamount
:交易金额
在MySQL中查询
在MySQL中,如果我们要查询每个月的总销售额,可以使用如下SQL语句:
SELECT
DATE_FORMAT(transaction_date, '%Y-%m') AS month,
SUM(amount) AS total_sales
FROM
sales
GROUP BY
DATE_FORMAT(transaction_date, '%Y-%m');
MySQL的局限性
- 单节点处理:MySQL处理这些查询是在单个节点上进行,此时内存、I/O和计算资源成为了主要瓶颈。处理TB级数据,单节点很难承受高负载。
- 扩展性差:扩展能力有限,增加更多存储和计算资源相对复杂且成本高。
在Hive中查询
在Hive中,我们将数据存储在HDFS中,并创建相应的Hive表,然后进行相同的查询:
创建和加载表
CREATE EXTERNAL TABLE sales (
transaction_id STRING,
transaction_date STRING,
custom