当前位置: 首页 > news >正文

大数据(3)-Hive

🍋一、Hive特性

Hive构建在Hadoop文件系统之上,Hive不提供实时的查询和基于行级的数据更新操作,不适合需要低延迟的应用,如联机事务处理(On-line Transaction Processing,OLTP)相关应用。

Hive适用于联机分析处理(On-Line Analytical Processing,OLAP),应用场景如图所示:

img

Hive作为数据仓库软件,使用类SQL的HiveQL语言实现数据查询,所有Hive数据均存储在Hadoop文件系统中,Hive具有以下特性。

1)使用HiveQL以类SQL查询的方式轻松访问数据,将HiveQL查询转换为MapReduce的任务在Hadoop集群上执行,完成ETL(Extract、Transform、Load,提取、转换、加载)、报表、数据分析等数据仓库任务。HiveQL内置大量UDF(User Defined Function)来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF函数来完成内置函数无法实现的操作。

2)多种文件格式的元数据服务,包括TextFile、SequenceFile、RCFile和ORCFile,其中TextFile为默认格式,创建SequenceFile、RCFile和ORCFile格式的表需要先将文件数据导入到TextFile格式的表中,然后再把TextFile表的数据导入SequenceFile、RCFile和ORCFile表中。

3)直接访问HDFS文件或其他数据存储系统(如HBase)中的文件。

4)支持MapReduce、Tez、Spark等多种计算引擎,可根据不同的数据处理场景选择合适的计算引擎。

5)支持HPL/SQL程序语言,HPL/SQL是一种混合异构的语言,可以理解几乎任何现有的过程性SQL语言(如Oracle PL/SQL、Transact-SQL)的语法和语义,有助于将传统数据仓库的业务逻辑迁移到Hadoop上,是在Hadoop中实现ETL流程的有效方式。

6)可以通过HiveLLAP(Live Long and Process)、Apache YARN和Apache Slider(动态YARN应用,可按需动态调整分布式应用程序的资源)进行秒级的查询检索。LLAP结合了持久查询服务器和优化的内存缓存,使Hive能够立即启动查询,避免不必要的磁盘开销,提供较佳的查询检索效率。

🍋二、Hive的架构原理

Hive架构中主要包括客户端(Client)、Hive Server、元数据存储(MetaStore)、驱动器(Driver)。

1) Hive架构

Hive有多种接口供客户端使用,其中包括Thrift(Apache的一种软件框架,用于可扩展的跨语言服务开发)接口、数据库接口、命令行接口和Web接口。

数据库接口包括ODBC(Open Database Connectivity,开放数据库连接)和JDBC(Java DataBase Connectivity,Java数据库连接)。

客户端通过Thrift接口及数据库接口访问Hive时,用户需连接到Hive Server,通过Hive Server与Driver通信。命令行接口CLI是和Hive交互的最简单方式,可以直接调用Driver进行工作。CLI只能支持单用户,可用于管理员工作,但不适用于高并发的生产环境。用户也可使用Web接口通过浏览器直接访问Driver并调用其进行工作。

Hive Server作为JDBC和ODBC的服务端,提供Thrift接口,可以将Hive和其他应用程序集成起来。Hive Server基于Thrift软件开发,又被称为Thrift Server。Hive Server有两个版本,包括HiveServer和HiveServer2。HiveServer2本身自带了一个命令行工具BeeLine,方便用户对HiveServer2进行管理。

MetaStore存储Hive的元数据,Hive的元数据包括表的名字、表的属性、表的列和分区及其属性、表的数据所在目录等。**元数据被存储在单独的关系数据库中,常用的数据库有MySQL和Apache Derby(Java数据库)。MetaStore提供Thrift界面供用户查询和管理元数据。**

Driver接收客户端发来的请求,管理HiveQL命令执行的生命周期,并贯穿Hive任务整个执行期间。Driver中有编译器(Compiler)、优化器(Optimizer)和执行器(Executor)三个角色。Compiler编译HiveQL并将其转化为一系列相互依赖的Map/Reduce任务。Optimizer分为逻辑优化器和物理优化器,分别对HiveQL生成的执行计划和MapReduce任务进行优化。Executor按照任务的依赖关系分别执行Map/Reduce任务。

img

2)HCatalog

HCatalog用于Hadoop的表和元数据管理,使用户可以使用不同的数据处理工具(如Pig、MapReduce等)更轻松地读取和写入元数据。HCatalog基于Hive的MetaStore为数据处理工具提供服务。

3)WebHCat

WebHCat是HCatalog的REST(Representational State Transfer,表现状态传输)接口,可以使用户能够通过安全的HTTPS协议执行操作。如图6-3所示,用户可以通过WebHCat访问Hadoop MapReduce(或YARN)、Pig(Apache的大型数据集分析平台)、Hive和HCatalog DDL(Data Definition Language,数据库模式定义语言)。WebHCat所使用的数据和代码在HDFS中维护,执行操作时需从HDFS读取。HCatalog DLL命令在接收请求时直接执行;MapReduce、Pig和Hive作业则由WebHCat服务器排队执行,可以根据需要监控或停止。

🍋三、Hive的数据存储模型

Hive主要包括三类数据模型:表(Table)、分区(Partition)和桶(Bucket)。

Hive中的表类似于关系数据库中的表。表可以进行过滤、投影、连接和联合等操作。表的数据一般存储在HDFS的目录中,Hive的表实质上对应Hadoop文件系统上的一个目录。Hive将表的元数据存储在关系型数据库中,实现了元数据与数据的分离存储。

Hive根据分区列(Partition Column)的值将表以分区的形式进行划分,例如具有“日期”分区列的表可以根据日期划分为多个分区。表中的一个分区对应表所在目录下的一个子目录。

1)Hive的分区和分桶 Hive将数据组织成数据库表的形式供用户进行较高效的查询分析。Hive处理的数据集一般较大,为了提高查询的效率,Hive会在表的基础上进一步对数据的划分进行细化。

当表数据量较大时,Hive通过列值(如日期、地区等)对表进行分区处理(Partition),便于局部数据的查询操作。每个分区是一个目录,将相同属性的数据放在同个目录下,可提高查询效率。分区数量不固定,分区下可再有分区或者进一步细化为桶。

Hive可将表或分区进一步组织成桶,桶是比分区粒度更细的数据划分方式。每个桶是一个文件,用户可指定划分桶的个数。在分桶的过程中,Hive针对某一列进行哈希计算,根据哈希值将这一列中的数据划分到不同的桶中。分桶为表提供了额外的结构,Hive在处理某些查询(如join、表的合并)时利用这个结构可以提高效率,使数据抽样更高效。

Hive分桶表通过数据分片与哈希分布机制,实现了JOIN操作的优化,具体表现为:

  1. 减少数据Shuffle:JOIN时只需在相同编号的桶之间进行,避免了全量Shuffle。

  2. 降低网络传输和磁盘I/O开销:显著提升了查询性能。

  3. 适用于等值JOIN场景:尤其是JOIN键与分桶列一致且分桶数相同的场景。

2)Hive的托管表和外部表 Hive中的表分为两种,分别为托管表和外部表托管表又称为内部表。Hive默认创建托管表,托管表由Hive来管理数据,意味着Hive会将数据移动到数据仓库的目录中。若创建外部表,Hive仅记录数据所在路径,不将其移动到数据仓库目录中。在读取外部表时,Hive会在数据仓库之外读取数据。在做删除表的操作时,托管表的元数据和数据会被一起删除,而外部表仅删除元数据,处于数据仓库外部的数据则被保留。外部表相对于托管表要更为安全,也利于数据的共享。

选择使用外部表还是托管表组织数据取决于用户对数据的处理方式,如果一个数据集的数据处理操作都由Hive完成,则使用托管表;当需要使用桶时,则必须使用托管表。如果需要用Hive和其他工具一起处理同一个数据集,或者需要将同一个数据集组织成不同的表,则使用外部表。

1、什么是Hive?

Hive是基于Hadoop的数据仓库工具。可以用于存储在Hadoop集群中的HDFS文件数据集进行数据整理、特殊查询和分析处理。Hive提供了类似于关系型数据库SQL语言的HiveQL工具,通过HiveQL可以快速实现简单的MapReduce统计。

Hive的本质就是将HiveQL语句转换为MapReduce任务后运行,非常适合做数据仓库的数据分析。

2、Hive的应用场景

Hive构建在Hadoop文件系统之上,Hive不提供实时的查询和基于行级的数据更新操作,不适合需要低延迟的应用,如联机事务处理(On-line Transaction Processing,OLTP)相关应用。

Hive适用于联机分析处理(On-Line Analytical Processing,OLAP),应用场景如图所示:

img

3、Hive的特性

Hive作为数据仓库软件,使用类SQL的HiveQL语言实现数据查询,所有Hive数据均存储在Hadoop文件系统中,Hive具有以下特性。

1)使用HiveQL以类SQL查询的方式轻松访问数据,将HiveQL查询转换为MapReduce的任务在Hadoop集群上执行,完成ETL(Extract、Transform、Load,提取、转换、加载)、报表、数据分析等数据仓库任务。HiveQL内置大量UDF(User Defined Function)来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF函数来完成内置函数无法实现的操作。

2)多种文件格式的元数据服务,包括TextFile、SequenceFile、RCFile和ORCFile,其中TextFile为默认格式,创建SequenceFile、RCFile和ORCFile格式的表需要先将文件数据导入到TextFile格式的表中,然后再把TextFile表的数据导入SequenceFile、RCFile和ORCFile表中。

3)直接访问HDFS文件或其他数据存储系统(如HBase)中的文件。

4)支持MapReduce、Tez、Spark等多种计算引擎,可根据不同的数据处理场景选择合适的计算引擎。

5)支持HPL/SQL程序语言,HPL/SQL是一种混合异构的语言,可以理解几乎任何现有的过程性SQL语言(如Oracle PL/SQL、Transact-SQL)的语法和语义,有助于将传统数据仓库的业务逻辑迁移到Hadoop上,是在Hadoop中实现ETL流程的有效方式。

6)可以通过HiveLLAP(Live Long and Process)、Apache YARN和Apache Slider(动态YARN应用,可按需动态调整分布式应用程序的资源)进行秒级的查询检索。LLAP结合了持久查询服务器和优化的内存缓存,使Hive能够立即启动查询,避免不必要的磁盘开销,提供较佳的查询检索效率。

4、Hive与传统数据仓库的区别

Hive是用于查询分布式大型数据集的数据仓库,相比于传统数据仓库,在大数据的查询上有其独特的优势,但同时也牺牲了一部分性能,如下图:

img

5、Hive的数据存储模型

Hive主要包括三类数据模型:表(Table)、分区(Partition)和桶(Bucket)。

Hive中的表类似于关系数据库中的表。表可以进行过滤、投影、连接和联合等操作。表的数据一般存储在HDFS的目录中,Hive的表实质上对应Hadoop文件系统上的一个目录。Hive将表的元数据存储在关系型数据库中,实现了元数据与数据的分离存储。

Hive根据分区列(Partition Column)的值将表以分区的形式进行划分,例如具有“日期”分区列的表可以根据日期划分为多个分区。表中的一个分区对应表所在目录下的一个子目录。

1)Hive的分区和分桶

Hive将数据组织成数据库表的形式供用户进行较高效的查询分析。Hive处理的数据集一般较大,为了提高查询的效率,Hive会在表的基础上进一步对数据的划分进行细化。

当表数据量较大时,Hive通过列值(如日期、地区等)对表进行分区处理(Partition),便于局部数据的查询操作。每个分区是一个目录,将相同属性的数据放在同个目录下,可提高查询效率。分区数量不固定,分区下可再有分区或者进一步细化为桶。

Hive可将表或分区进一步组织成桶,桶是比分区粒度更细的数据划分方式。每个桶是一个文件,用户可指定划分桶的个数。在分桶的过程中,Hive针对某一列进行哈希计算,根据哈希值将这一列中的数据划分到不同的桶中。分桶为表提供了额外的结构,Hive在处理某些查询(如join、表的合并)时利用这个结构可以提高效率,使数据抽样更高效。

2)Hive的托管表和外部表

Hive中的表分为两种,分别为托管表和外部表,托管表又称为内部表。Hive默认创建托管表,托管表由Hive来管理数据,意味着Hive会将数据移动到数据仓库的目录中。若创建外部表,Hive仅记录数据所在路径,不将其移动到数据仓库目录中。在读取外部表时,Hive会在数据仓库之外读取数据。在做删除表的操作时,托管表的元数据和数据会被一起删除,而外部表仅删除元数据,处于数据仓库外部的数据则被保留。外部表相对于托管表要更为安全,也利于数据的共享。

选择使用外部表还是托管表组织数据取决于用户对数据的处理方式,如果一个数据集的数据处理操作都由Hive完成,则使用托管表; 当需要使用桶时,则必须使用托管表。如果需要用Hive和其他工具一起处理同一个数据集,或者需要将同一个数据集组织成不同的表,则使用外部表。

Hive数据分析常用通用方法

1. 数据准备与探索

-- 数据采样
SELECT * FROM table TABLESAMPLE(10 PERCENT);
​
-- 数据分布分析
SELECT column,COUNT(*) AS cnt,COUNT(DISTINCT id) AS uniq_cnt,ROUND(COUNT(*)/SUM(COUNT(*)) OVER(), 4) AS ratio
FROM table
GROUP BY column
ORDER BY cnt DESC;
​
-- 数据质量检查
SELECTCOUNT(*) AS total_rows,COUNT(DISTINCT id) AS distinct_ids,SUM(CASE WHEN column IS NULL THEN 1 ELSE 0 END) AS null_count,MIN(date_column) AS min_date,MAX(date_column) AS max_date
FROM table;

2. 核心分析方法库

(1) 分组聚合与透视
-- 基础分组聚合
SELECT department,gender,AVG(salary) AS avg_salary,PERCENTILE(salary, 0.5) AS median_salary
FROM employees
GROUP BY department, gender;
​
-- 使用CUBE/ROLLUP进行多维聚合
SELECT COALESCE(department, 'All') AS department,COALESCE(gender, 'All') AS gender,COUNT(*) AS emp_count
FROM employees
GROUP BY CUBE(department, gender);
(2) 窗口函数应用
-- 排名与移动计算
SELECTuser_id,date,amount,RANK() OVER(PARTITION BY user_id ORDER BY amount DESC) AS rank,SUM(amount) OVER(PARTITION BY user_id ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS 3day_sum
FROM transactions;
(3) 时间序列处理
-- 同比环比分析
SELECTmonth,sales,LAG(sales, 1) OVER(ORDER BY month) AS prev_month,sales - LAG(sales, 1) OVER(ORDER BY month) AS mom_growth,FIRST_VALUE(sales) OVER(PARTITION BY YEAR(month) ORDER BY monthROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS year_first_month,sales/FIRST_VALUE(sales) OVER(PARTITION BY YEAR(month) ORDER BY month) AS yoy_index
FROM monthly_sales;
(4) 复杂数据处理模式

sql

-- 会话分割
WITH session_marked AS (SELECTuser_id,event_time,CASE WHEN UNIX_TIMESTAMP(event_time) - UNIX_TIMESTAMP(LAG(event_time) OVER(PARTITION BY user_id ORDER BY event_time)> 1800 THEN 1 ELSE 0 END AS new_sessionFROM events
)
SELECTuser_id,SUM(new_session) OVER(PARTITION BY user_id ORDER BY event_time) AS session_id,event_time
FROM session_marked;
​
-- 漏斗分析
SELECTCOUNT(DISTINCT view.user_id) AS view_users,COUNT(DISTINCT cart.user_id) AS cart_users,COUNT(DISTINCT order.user_id) AS order_users,COUNT(DISTINCT order.user_id)/COUNT(DISTINCT view.user_id) AS conversion_rate
FROM page_views view
LEFT JOIN cart_events cart ON view.user_id = cart.user_id
LEFT JOIN orders order ON view.user_id = order.user_id;

一、Hive与Impala区别

Impala和Hive都是Apache Hadoop生态系统中的重要组件,用于处理大规模数据集。尽管它们有许多相似之处,如支持SQL查询、能够读取存储在HDFS中的数据等,但它们在设计目标、性能和适用场景上仍有一些不同。

首先,从设计目标上看,Hive是一个数据仓库工具,主要用于数据查询和分析,对数据的实时处理能力较弱。而Impala则是一个实时分布式SQL查询引擎,旨在提供高性能、低延迟的查询响应。因此,对于需要实时分析数据的应用场景,Impala通常是一个更好的选择。

二、两者速度上的区别

其次,在性能方面,Impala通常比Hive更快。这主要是因为Impala是基于内存的运算,而Hive则依赖于磁盘I/O。Impala可以充分利用集群中的所有资源,使得查询响应更快。此外,由于Impala使用了与Hive类似的SQL语法,用户可以更容易地编写查询语句,同时保持较高的性能。

然而,Impala也有一些缺点。首先,与Hive相比,Impala对内存的依赖更大。当处理大型数据集时,如果内存不足,Impala的性能可能会受到影响。其次,由于Impala不支持用户自定义函数(UDF),因此它能够处理的问题域有一定的限制。此外,Impala也不能直接读取自定义二进制文件,这可能会限制其在某些应用场景中的使用。

另外,每当新的记录或文件被添加到HDFS中的数据目录时,Impala需要刷新表。这可能会增加维护工作量。此外,由于Impala没有查询期的容错逻辑,如果在执行过程中发生故障,查询将直接失败。

三、适应场景

总的来说,Impala和Hive各有千秋。选择使用哪一个工具取决于具体的应用需求和场景。如果需要实时分析大规模数据集,并且对性能有较高要求,那么Impala可能是一个更好的选择。然而,如果需要更强大的数据转换和处理能力,或者对内存资源有限制,那么Hive可能更适合需求。

值得注意的是,为了充分利用Impala的性能优势,用户需要对其进行适当的配置和维护。例如,确保集群中的内存资源充足、优化Impala的配置参数等。此外,由于Impala和Hive可以相互配合使用,一些用户可能会选择同时使用这两个工具以满足不同的需求。例如,可以使用Hive进行复杂的数据转换和处理任务,然后使用Impala对结果进行实时查询和分析。

http://www.lqws.cn/news/585433.html

相关文章:

  • iOS 应用上架踩坑实录:7 个问题 + 工具组合解决方案详解
  • STL简介+string模拟实现
  • 【Docker基础】Docker数据持久化与卷(Volume)介绍
  • 24V转12V降压实际输出12.11V可行性分析
  • gravitino0.9 安装部署集成Trino-439查询Hive3.1.3和MySQL8.0.33
  • 88.LMS当幅度和相位同时失配时,为啥最后权值w的相位angle(w(end))收敛到angle(mis)不是-angle(mis)
  • 从零到一通过Web技术开发一个五子棋
  • SpringBoot --项目启动的两种方式
  • js遍历对象的方法
  • 【MySQL】数据库基础
  • .net8导出影像图片按现场及天拆分
  • 51单片机CPU工作原理解析
  • 借助 KubeMQ 简化多 LLM 集成
  • YOLOv12_ultralytics-8.3.145_2025_5_27部分代码阅读笔记-torch_utils.py
  • 后台填坑记——Golang内存泄漏问题排查(一)
  • 设计模式(六)
  • 大模型开源技术解析 4.5 的系列开源技术解析:从模型矩阵到产业赋能的全栈突破
  • 2025年06月30日Github流行趋势
  • 遥控器双频无线模块技术要点概述
  • SegChange-R1:基于大型语言模型增强的遥感变化检测
  • 07-three.js Debug UI
  • Webpack原理剖析与实现
  • QT中QSS样式表的详细介绍
  • 【MySQL基础】MySQL索引全面解析:从原理到实践
  • 汽车轮速测量专用轮速传感器
  • 51c~UWB~合集1
  • SpringBoot项目开发实战销售管理系统——项目框架搭建!
  • 【windows上VScode开发STM32】
  • C#数字格式化全解析:从基础到进阶的实战指南
  • 电铸Socket弹片测试全解析:如何提升5G连接器稳定性?