我眼中的Hive-你眼中的了?

本文介绍了Hive作为基于Hadoop的数据仓库工具的功能和用途。它能够处理海量结构化数据,提供类SQL查询功能,并简化MapReduce任务的创建过程。文章还详细阐述了Hive的体系结构、运行机制及优缺点。

万花筒

大众眼中的hive

hive是基于Hadoop的一个数据仓库工具,我们经常用来对数据仓库进行数据统计分析。其中包括我们大家都知道的通过类似SQL语句实现快速MapReduce统计,将数据进行提取、转化、加载。

这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。它使MapReduce变得更加简单,而不必开发专门的MapReduce应用程序。

我眼中的hive

  • Hive:由Facebook开发用于解决海量结构化日志的数据统计。
  • Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL 查询功能。
  • Hive是构建在Hadoop之上的数据仓库平台。
  • Hive是一个SQL解析引擎,它将SQL语句转译成MapReduce作业并在Hadoop上执行。
  • Hive表是HDFS的一个文件目录,一个表名对应一个目录名,如果有分区表的话,则分区值对应子目录名。
    它的本质是:将HQL转化成MapReduce 程序

Hive的生母

  • Hive是Facebook开发的,构建于Hadoop集群之上的数据仓库应用。2008年Facebook将Hive项目贡献给Apache,成为ASF开源顶级项目。
  • 目前最新版本hive-4.0.0

Hive体系结构

Hive在Hadoop 心中的位置

我们来看一下Hive在Hadoop 心中的位置。
在这里插入图片描述

Hive的设计特征

做为Hadoop 的数据仓库处理工具,它所有的数据都存储在Hadoop 兼容的文件系统中。Hive在加载数据过程中不会对数据进行任何的修改,只是将数据移动到HDFS 中Hive 设定的目录下,因此,Hive不支持对数据的改写和添加,所有的数据都是在加载的时候确定的。Hive 的设计特点如下。

1、支持索引,加快数据查询。
2、不同的存储类型,例如,纯文本文件、HBase 中的文件。
3、将元数据保存在关系数据库中,减少了在查询中执行语义检查时间。
4、可以直接使用存储在Hadoop 文件系统中的数据。
内置大量用户函数UDF 来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF 函数来完成内置函数无法实现的操作。
5、类SQL 的查询方式,将SQL 查询转换为MapReduce 的job 在Hadoop集群上执行。
6、编码跟Hadoop同样使用UTF-8字符集。

Hive的体系结构

在这里插入图片描述
一、解析器

  • 编译器:主要完成 HQL 语句从词法分析、语法分析、编译、优化以及执行计划的生成。
  • 优化器是一个演化组件,当前它的规则是:列修剪,谓词下压。
  • 执行器会顺序执行所有的Job。如果Task链不存在依赖关系,可以采用并发执行的方式执行Job。

二、元数据库

  • Hive的数据由两部分组成:数据文件和元数据。元数据用于存放Hive库的基础信息,它存储在关系数据库中,如
    mysql、derby。元数据包括:数据库信息、表的名字,表的列和分区及其属性,表的属性,表的数据所在目录等。

三、Hadoop

  • Hive 的数据文件存储在 HDFS 中,大部分的查询由 MapReduce 完成。(对于包含 * 的查询,比如 select * from tablename 不会生成 MapRedcue 作业)

Hive的运行机制

在这里插入图片描述

在这里插入图片描述

Hive的核心-编译器

在这里插入图片描述

Hive的优缺点

在这里插入图片描述

<think>嗯,用户的问题聚焦在Spring Boot整合Hive时依赖包的选择问题,具体是想确认引入hive-jdbc后是否需要额外引入hive-service。从用户提供的引用内容看,ta显然遇到了依赖冲突问题(如jetty包的NoSuchMethodError),并且已经通过排除冲突包解决了启动问题[^1][^2]。 用户可能是个中级Java开发者,正在搭建数据平台相关服务。ta的提问非常精准,说明对Hive组件有基本了解,但可能不熟悉其模块化设计。深层需求应该是想避免不必要的依赖引入,防止再次现包冲突——毕竟之前已经吃过亏了。有趣的是用户引用的资料里还提到INSERT语句示例[^3],暗示ta后续可能需要写入Hive,这点可以埋个伏笔。 技术上需要拆解两个关键点:一是hive-jdbc的依赖范围,官方文档明确说明它已包含Thrift协议通信能力;二是hive-service的定位,它实际上是HiveServer2的服务端实现,在客户端场景完全冗余。特别要注意hive-jdbc 1.2.1版本会传递依赖jetty-all(这正是用户遇到冲突的根源[^2]),但不需要因此误认为缺少服务端组件。 突然想到用户可能被某些过时教程误导了——早期Hive确实有独立的hive-service模块,但HiveServer2重构后已废弃该设计。现在回答时要强调版本差异,避免用户走弯路。另外可以补充依赖树验证方法,毕竟Maven的依赖传递机制容易引发这类问题。 最后那个INSERT示例引用[^3]很有意思,用户虽然没直接问,但接下来很可能要操作Hive表。在相关问题里埋个SQL执行的话题应该很实用,毕竟JDBC连接成功后的操作才是重头戏。 </think>在 Spring Boot 项目中引入 `hive-jdbc` 后,**通常不需要再额外引入 `hive-service`**。以下是详细分析和建议: ### 原因解析 1. **依赖功能覆盖** `hive-jdbc` 已包含通过 JDBC 驱动连接 HiveServer2 的核心能力。其 Maven 依赖声明如下(以 1.2.1 版本为例): ```xml <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>1.2.1</version> </dependency> ``` 该依赖默认传递引入以下关键组件: - Hive 的 JDBC 接口实现 - Thrift 协议通信层(用于与 HiveServer2 交互) - Hadoop 基础库 2. **hive-service 的定位** `hive-service` 主要用于 **服务端部署**(如 HiveServer2 或 Hive Metastore 服务),包含以下非客户端所需功能: ``` - 服务启动类(如 HiveServer2 的 main 方法) - 权限管理扩展 - 服务端会话管理 ``` 在 Spring Boot 客户端应用中引入会造成冗余依赖,甚至触发依赖冲突(如 Jetty 版本冲突[^2])。 ### 正确配置建议 1. **基础依赖** 只需引入 `hive-jdbc` 并排除冲突包(参考历史解决方案[^2]): ```xml <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>1.2.1</version> <exclusions> <exclusion> <groupId>org.eclipse.jetty.aggregate</groupId> <artifactId>jetty-all</artifactId> </exclusion> <exclusion> <groupId>org.apache.hive</groupId> <artifactId>hive-shims</artifactId> </exclusion> </exclusions> </dependency> ``` 2. **连接示例** 通过 JDBC 直接操作 Hive: ```java // 数据源配置(application.yml) spring: datasource: url: jdbc:hive2://hive-server:10000/default driver-class-name: org.apache.hive.jdbc.HiveDriver username: hive password: hive // SQL 执行示例[^3] @Autowired private JdbcTemplate jdbcTemplate; public void insertData() { String sql = "INSERT INTO TABLE user_sample VALUES(888,'Plum','M',32)"; jdbcTemplate.execute(sql); } ``` ### 特殊情况 若需直连 **Hive Metastore**(而非 HiveServer2),才需额外引入: ```xml <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-metastore</artifactId> <version>${hive.version}</version> </dependency> ``` 但此场景非常少见,通常由元数据管理中间件处理。 --- **结论**:在标准的 Hive 数据查询场景下,引入 `hive-jdbc` 已满足需求,**无需添加 `hive-service`**。重点应放在解决依赖冲突(如 Jetty 版本)[^2] 和正确配置 JDBC 连接。
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风一样的美狼子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值