如何优化开放数据湖仓一体的性能

数据湖仓一体架构由 Apache Hudi、Apache Iceberg 和 Delta Lake 等开放表格式提供支持,提供了一种开放且经济高效的方式来管理组织不断增长的数据和分析需求。它提供了在同一数据存储上运行并发事务的可靠性,从而提高了效率。数据湖仓一体支持关键功能,例如 ACID 事务、架构演变、时间旅行和增量/CDC 查询,这些功能以前在数据湖上不可用。

虽然采用湖仓一体架构提供了这些切实的好处,但重要的是要认识到这只是旅程的第一步。随着越来越多的数据被摄取到存储中,无论是 Amazon S3、GCS 或 Azure Blob 等云对象存储,还是本地系统,都必须考虑湖仓一体中数据文件的最佳管理。对数百 TB 甚至 PB 的数据运行查询需要持续优化以保持性能。

尽管查询可能正在高效运行,但将来可能并非总是如此。如果不进行适当的优化,随着数据的增长和存储空间中积累更多的文件,性能可能会下降。通常可能会开始遇到以下常见问题:

• 由于文件杂乱无章或文件小而导致查询速度变慢:如果不定期维护,计算引擎最终可能会扫描大量大小低下或杂乱无章的文件,从而导致查询时间延长和成本增加。此外由多个团队运行相同的慢速查询可能会导致查询时间和成本增加。

• 不断变化的查询模式:随着时间的推移,业务需求可能会发生变化,从而导致访问和分析最初未针对数据进行优化的新方法。

• 新查询和工作负载:新兴的分析使用案例可能需要不同的查询优化来保持性能。

要应对这些挑战,需要执行各种优化任务,包括分区、压缩、集群、数据跳过和清理。这些技术可以更好地组织数据,有助于在查询期间删除不必要的数据,并确保数据可以有效地访问并随着时间的推移保持可管理性。在查询期间需要扫描的数据越少,查询的速度就越快,成本效益就越高。

在下面的部分中,我们将详细介绍这些技术,并提供有关如何应用它们来优化数据湖仓一体中的存储并提高查询性能的见解。

分区

分区是优化大规模数据数据访问的最基本技术之一。它涉及根据特定列(通常是通常查询的字段)或条件(如日期、地理区域或类别)将数据划分为更小、更易于管理的块或分区。分区通过将需要读取的数据限制为仅相关分区,有助于减少查询期间扫描的数据量。

图 1:分区前后的 Logs 表

查询:

SELECT details FROM Logs

WHERE event_date = '2018-12-02'

例如,考虑 Logs 表,如上所示。最初该表由一组数据文件组成,每个文件表示日志条目的混合。如果我们运行查询来检索特定日期范围(例如 2018 年 12 月 2 日)的日志条目,则查询引擎必须扫描表中的所有文件才能找到匹配的行。这种方法效率低下,尤其是在处理大量数据时。

在这种情况下,如果我们按 event_date 对表进行分区,则可以将日志数据组织成组,其中每个分区都包含特定日期的日志。例如,分区 A 保存 2018 年 12 月 1 日的日志,分区 B 保存 2018 年 12 月 2 日的日志,依此类推。此分段允许查询引擎完全跳过不相关的分区。在我们的示例中,如果我们只对 2018 年 12 月 2 日的日志感兴趣,引擎可以忽略分区 A 和 C,它们分别包含 12 月 1 日和 3 日的日志。

除了性能优势之外,分区[1]还为数据架构提供了一系列其他优势。其中一个优势是可扩展性。通过跨多个分区分配数据,系统可以水平扩展,从而允许随着数据量的增长而轻松扩展。分区还可以增强可用性。由于数据分布在多个分区中,因此单个分区的故障不会使整个系统瘫痪;相反只有受影响的特定分区可能暂时不可用,而其余数据仍可访问。

文件大小 (压缩)

随着时间的推移,随着数据被摄取到存储系统中,会产生大量小文件,从而导致通常所说的“小文件问题”。这些小文件会导致查询引擎处理许多文件,从而增加 I/O 开销并降低查询性能,因为打开、读取和关闭每个文件都会产生成本(取决于查询)。

文件大小调整或压缩是数据湖仓一体架构中的一项重要技术,可确保将大小低下的小型文件合并为更大、更优化的文件。如果不定期压缩,文件计数可能会呈指数级增长,随着数据量的增加,系统性能会严重下降。

文件大小调整算法的目标是将这些较小的文件合并为满足系统目标文件大小的较大文件,从而减少文件数量并提高查询效率。通过这样做,系统可以保持快速查询速度并优化存储使用情况,最终提供更好的可扩展性和成本效率。

跨开放表格式进行压缩的最常用算法之一是 bin 打包算法。此算法旨在将小文件合并为较大的、接近最佳大小的文件,确保合并的文件接近系统定义的目标大小,而不会超过该大小。装箱方法简单而有效,因为它可以有效地对小文件进行分组,以最大限度地减少空间浪费并减少整体文件数量。

如图所示,小文件(文件 1:40 MB、文件 2:80 MB 和文件 3:90 MB)被压缩为大小合适的较大文件,达到系统的目标文件大小 120 MB。此过程减少了文件总数,同时确保每个文件都得到充分利用,从而提高了查询性能并降低了存储开销。

图 2:将较小大小的文件合并为较大的文件的压缩过程

Apache Hudi 架构的一个关键设计特征是其避免创建小文件的内置能力。Hudi 经过独特设计,可自动将文件写入最佳大小,无需手动管理文件大小[2]。在数据摄取期间,Hudi 使用配置设置动态调整文件大小,例如:

• Max File Size(最大文件大小):任何文件大小的上限。

• Small File Size:一个阈值,低于该阈值时,将考虑对文件进行压缩/文件大小调整。

• Insert Split Size:插入期间数据拆分的大小。

注意:在 Hudi 中,将较小大小的文件合并为较大的文件的过程(在其他湖仓一体格式中称为压缩)称为文件大小调整。Hudi 使用压缩一词来描述不同的过程[3]:将日志文件(存储在 Avro 中)与现有基本文件(存储在 Parquet 中)合并,以创建新的更新基本文件(也存储在 Parquet 中)。然后,新的更新将转到新的更改日志文件,直到下一次 Hudi 压缩操作。

作为文件大小的 Hudi 实施示例,在上图中 Hudi 使用的最大文件大小为 120 MB,小文件大小为 100 MB。在摄取过程中,Hudi 会填充文件以满足 120 MB 的限制,并根据需要整合较小的文件,以避免留下小文件。这可确保文件大小保持最佳状态,从而提高性能。此自动文件大小调整过程在每个摄取周期中发生,有助于维护大小合适的文件,并防止随着时间的推移积累小而低效的文件。最重要的是除了设置所需的阈值外,此过程不需要用户干预。

聚簇

聚簇是一种优化技术,用于对文件中的数据进行重新组织和分组,通过最大限度地减少扫描的数据量来帮助提高查询性能。聚簇解决的核心问题是数据的写入方式和查询方式之间的不一致。通常,数据是根据到达时间写入的,这不一定与事件时间或稍后查询的其他关键属性一致。例如,在查询经常按特定列(如位置或事件日期)进行筛选的分析工作负载中,分布在许多文件中的数据会迫使查询引擎扫描不必要的文件,这可能会对性能产生巨大影响。聚簇技术通常涉及两个主要策略:简单排序和多维聚簇。

排序

最简单的聚簇形式是排序,其中数据按特定列排序,例如城市(如下图所示)或其他经常查询的字段。排序可确保将具有相似值的数据行分组到一个数据文件中,每个数据文件对于其排序所依据的特定列都有唯一的值范围,从而提高数据局部性。这允许查询引擎快速查找和扫描与查询相关的数据行,从而显著减少需要读取的文件数量。

图 3:按特定字段对数据进行排序

但是,虽然排序对于具有单个谓词的查询有效,但在查询涉及多个谓词时,它有局限性。例如,如果数据按 city 排序,则同时按 city 和 trip_duration 进行筛选的查询仍需要扫描与 city 筛选器匹配的所有文件,即使 trip_duration 筛选器排除了大多数记录。这就是简单排序的不足之处 — 仅优化涉及多个字段的多维查询是不够的。

多维聚簇

为了解决简单排序的局限性,更高级的聚簇技术(如多维聚簇)开始发挥作用。多维聚簇可同时跨多个列重新组织数据,从而优化对多个维度进行筛选的查询。多维聚类中最流行的方法之一是 Z 排序[4] - 一种空间填充曲线。Z 排序以保留空间局部性的方式跨多个列对数据进行排序,这意味着相似类型的记录最终位于同一数据文件中。例如,它适用于涉及纬度和经度数据的查询,确保附近位置的数据存储在一起,从而减少需要读取的文件数。

例如,如果同时对 city 和 trip_duration 进行查询筛选,则多维聚类分析可确保对数据进行组织,以便将两个谓词的相关记录分组到同一文件中。这减少了引擎必须扫描的文件数量,从而比单独进行简单排序的查询执行速度快得多。

其他技术(如 Hilbert 曲线)可实现类似的目标,但对于处理高维数据更有效,并且在查询跨越多个复杂维度时可以提供更好的聚类分析。希尔伯特曲线确保数据点在多个维度上保持紧密联系。

在部署这些聚类算法方面,Apache Hudi 提供了不同的模型。这些大致分为 asynchronous[5] 和 synchronous (inline[6])。内联集群通常作为常规摄取管道的一部分进行,这意味着在聚簇完成之前,无法进行下一轮摄取。另一方面,异步聚簇允许 Hudi 优化数据布局,而不会阻止正在进行的数据摄取。这使得 Hudi 对于需要频繁数据摄取和快速、高效查询的工作负载特别有效。有三种部署模式可用于运行异步聚簇:

• 同一进程内的异步执行

• 由单独的进程异步调度和执行

• 内联调度和异步执行

Hudi 允许根据查询模式,根据不同的排序或多维技术(如 Z 排序和希尔伯特曲线[7])对数据进行聚类。

数据跳过

数据跳过是一种用于通过消除扫描不相关数据文件来提高查询性能的技术。通过这样做,数据跳过可以最大限度地减少扫描的数据量,从而缩短查询执行时间并减少资源使用。这些技术在数据湖存储中尤其突出,因为数据湖存储的数据量通常很高。

图 4:显示字段的最小/最大值及其计数的 Parquet 页脚元数据

Parquet 文件格式是数据跳过的一个常见示例,该格式存储列级统计信息,例如每个文件的最小值和最大值。例如,在上面显示的 sales 表中,每个 Parquet 文件都记录了有关列(如 date 或 sales)的最小值和最大值的元数据。当查询按特定日期范围(例如,date >= '2022-06-01')进行筛选时,查询引擎会使用这些最小值/最大值跳过日期范围之外的文件,从而避免扫描不相关的数据。数据跳过利用这些列统计信息(例如最小值/最大值、Null 计数和记录计数)来确保仅处理相关数据。这种方法通过减少不必要的文件扫描(尤其是对于大型数据集)来显著提高查询性能。

同样,Bloom 筛选条件提供了另一种在湖仓一体中跳过数据的可靠方法。Bloom 过滤器是一种概率数据结构,可快速确定数据集中是否存在特定值。通过使用多个哈希函数将元素映射到固定大小的位数组中,Bloom 过滤器可以有效地识别“绝对不相关”与查询相关的文件或行组。尽管它们可能会返回误报(指示值可能存在,但实际上不存在),但它们永远不会产生误报。这使得它们能够非常有效地减少大型数据集中不必要的文件扫描。

虽然使用来自单个 Parquet 文件和 Bloom 筛选器的列级统计数据有助于跳过不相关的文件,但对每个文件执行这些操作(打开每个文件、读取页脚和关闭文件)在大规模上可能会成本高昂。为了避免这种开销,Apache Hudi 利用了元数据表[8]。Hudi 元数据表是一个多模式索引子系统[9],可存储各种类型的索引,使查询引擎能够根据查询谓词高效地查找相关数据文件,而无需从每个单独的文件中读取列统计信息或 Bloom 过滤器。通过使用这些索引,Hudi 可以删除不相关的文件并加快查询速度 - 有时甚至会提高几个数量级。

清理

在数据湖仓一体系统中,清理是保持性能和管理存储成本的关键过程。随着数据的不断写入、更新和删除,较旧的文件版本和元数据往往会随着时间的推移而累积。这可能会导致严重的存储空间膨胀和较长的文件列出时间,从而对查询性能产生负面影响。查询引擎必须筛选越来越多的元数据和不相关的数据,这会增加执行查询所需的时间和资源。与传统数据库系统一样,清理通过定期删除不再需要的过时数据版本和文件,并更新元数据以匹配来解决此问题,从而保持数据集精简并针对性能进行优化。

在 Apache Hudi 中,清理[10]是一项关键的表服务,用于通过删除较旧的文件版本来回收空间,这些版本是为时间旅行和回滚等功能而保留的。Hudi 使用多版本并发控制 (MVCC) 运行,从而在读取器和写入器之间实现快照隔离。虽然这允许存储多个文件版本,有助于查询回滚和历史数据访问,但保留过多版本会显著增加存储成本。

为了在保留历史记录和最大限度地减少存储膨胀之间取得平衡,Hudi 采用了自动清理服务。默认情况下,每次提交后立即触发清理以删除较旧的文件切片,从而确保元数据和数据的增长保持有限。此自动清理过程有助于保持表精简,防止过时文件的堆积。

为了获得更大的灵活性,用户可以使用 hoodie.clean.max.commits 配置设置来调整清理频率,允许清理进程在指定数量的提交后运行,而不是在每次提交后运行。这确保了可以根据工作负载要求以及历史记录保留和存储成本之间的预期权衡来定制清洁过程。

Hudi 提供不同的清洁政策,例如:

• 基于版本的清理:保留一定数量的最近文件版本,同时删除较旧的文件版本。

• 基于提交的清理:保留一定数量的提交(例如,最后 10 个)。

• 基于时间的清理:删除已超过指定期限(以小时为单位)的文件,确保仅保留最近的数据。

结论

优化数据湖仓一体架构中的性能对于管理不断增长的数据集和确保高效的查询执行至关重要。通过以符合查询模式的方式组织数据,减少小文件造成的开销,并利用元数据来最大限度地减少不必要的数据扫描,Apache Hudi 提供了快速、经济高效的查询。同时定期维护流程可确保清除过时的数据,防止存储膨胀。这些优化技术协同工作,确保随着数据的增长,数据架构保持可扩展性和高效性,从而能够在不影响性能的情况下满足不断变化的分析需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/13576.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

比较基因组分析

比较基因组分析(Comparative Genomics Analysis)是一门通过比较不同物种或个体的基因组序列来研究其相似性与差异性的科学方法。它有助于揭示物种间的进化关系、基因功能、生物适应性及潜在的疾病机制。近年来,随着高通量测序技术的发展&…

leetcode 148. 排序链表 中等

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4] 示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5]示例 3: …

基于单片机的智能小车(论文+源码)

1系统整体方案 此次多功能智能小车的设计系统,其整个控制电路的框架如下图所示。整个系统采用STM32单片机为控制器其中:LCD液晶负责显示当前信息,蜂鸣器负责特殊情况下进行报警提醒,红外遥控模块方便用户进行远程操作小车,电机模块拟采用前驱的方式&…

基于matlab的CNN食物识别分类系统,matlab深度学习分类,训练+数据集+界面

文章目录 前言🎓一、数据集准备🎓二、模型训练🍀🍀1.初始化🍀🍀2.加载数据集🍀🍀3.划分数据集,并保存到新的文件夹🍀🍀4.可视化数据集🍀🍀5.模型构建🍀🍀6.数据增强🍀🍀7.设置训练参数🍀🍀8.训练与测试🎓三、模型测试🍀🍀1.初始化�…

UCSD:LLM通过工具使用解决科学问题

📖标题:Adapting While Learning: Grounding LLMs for Scientific Problems with Intelligent Tool Usage Adaptation 🌐来源:arXiv, 2411.00412 🌟摘要 🔸大型语言模型(LLMs)在解…

【时间之外】IT人求职和创业应知【34】-人和机器人,机器人更可靠

目录 新闻一:人形机器人产业持续高速增长,2026年中国市场规模将突破200亿元 新闻二:AI技术驱动设备厂商格局变化,部分厂商市占率快速提升 新闻三:华为与江淮汽车携手打造超高端品牌“尊界”,计划于明年春…

MyBatis及相关文件配置

MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。以下是对MyBatis的详细讲解: 一、MyBatis的起源与发展 MyBatis最初是Apache的一个开源项目iBATIS,2010年迁移到Google Code并改名为MyBatis,2013年11月又…

【FastAPI】1-url参数

fastapi的核心功能是提供HTTP请求接口 “幂等”和“非幂等” 幂等(idempotent):如果一个方法重复执行多次,产生的效果是一样的,那么这个方法就是幂等的 “Methods can also have the property of “idempotence” in …

CentOS Stream 9设置静态IP

CentOS Stream 9设置静态IP CentOS Stream 9作为CentOS Stream发行版的下一个主要版本,已经发布有一段时间,但与目前广泛使用的CentOS7有较大区别。安装试用Stream 9的过程中,就发现设置静态IP的方式和CentOS7/8差别较大,在此记录…

机器人学 雅可比矩阵

雅可比矩阵(Jacobian Matrix)是机器人学中一个非常重要的工具,广泛应用于分析机器人末端执行器的速度和力学(静力)关系。理解雅可比矩阵的速度和静力作用对于机器人运动控制、动力学分析以及优化设计具有重要意义。 一…

【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-最小的数

CL13 最小的数(20 分) 输入一个有 n 个无重复元素的整数数组 a&#xff0c;输出数组中最小的数。提示&#xff1a;如使用排序库函数 sort()&#xff0c;需要包含头文件#include 。输入&#xff1a; 第一行一个正整数 n(2<n<20)&#xff1b; 第二行 n 个不重的整数 a[i]…

python数据写入excel文件

主要思路&#xff1a;数据 转DataFrame后写入excel文件 一、数据格式为字典形式1 k e &#xff0c; v [‘1’, ‘e’, 0.83, 437, 0.6, 0.8, 0.9, ‘好’] 1、这种方法使用了 from_dict 方法&#xff0c;指定了 orient‘index’ 表示使用字典的键作为行索引&#xff0c;然…

制作自己的刷题小题库,提高刷题效率

日常刷题 乱序/背题多种模式 组队刷题 查看小组的刷题统计 在线考试 创建考试多人同时答题 ----这是一条分割线----- 土著刷题&#xff0c;是一款可以导入题库的在线刷题学习小&#x1f34a;序&#xff0c;提供一套以【搭建题库-组建小组-刷题练习-在线考试】为中心的完整服务…

在 Oracle Linux 8.9 上安装Oracle Database 23ai 23.5

在 Oracle Linux 8.9 上安装Oracle Database 23ai 23.5 1. 安装 Oracle Database 23ai2. 连接 Oracle Database 23c3. 重启启动后&#xff0c;手动启动数据库4. 重启启动后&#xff0c;手动启动 Listener5. 手动启动 Pluggable Database6. 自动启动 Pluggable Database7. 设置开…

springboot线下培训机构集中管理和推荐平台-计算机毕业设计源码48919

摘 要 该论文研究了一种线下培训机构集中管理和推荐平台的设计与实现。该平台旨在解决传统线下培训机构管理和推荐过程中存在的诸多问题&#xff0c;包括信息不对称、资源分散、推荐不精准等。通过系统性的需求分析和技术调研&#xff0c;设计了一套基于Spring Boot和Vue的前后…

Jmeter中的监听器(一)

监听器 1--查看结果树 用途 调试测试计划&#xff1a;查看每个请求的详细信息&#xff0c;帮助调试和修正测试计划。分析响应数据&#xff1a;查看服务器返回的响应数据&#xff0c;验证请求是否成功。检查错误&#xff1a;识别和分析请求失败的原因。 配置步骤 添加查看结果…

机器学习—多个输出的分类(Optional)

有一种不同类型的分类问题&#xff0c;称为多标签分类问题&#xff0c;与每个图像相关联的地方可能有多个标签。 如果你正在制造一辆自动驾驶汽车或者驾驶辅助系统&#xff0c;然后给你一张车前的照片&#xff0c;你可能想问&#xff0c;比如有没有一辆车或者至少有一辆车还是…

上海市计算机学会竞赛平台2020年4月月赛丙组永恒的生命游戏

题目背景 2020年4月11日&#xff0c;英国数学家 约翰霍顿康威&#xff08;John Horton Conway&#xff09;因为新型冠状病毒肺炎不幸逝世。他在群论、数论、代数、几何拓扑、理论物理、组合博弈论和几何等领域&#xff0c;都做出了重大贡献。他的离去是人类文明的损失。他最著…

SQLI LABS | Less-43 POST-Error Based-String-Stacked With Twist

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-43/ 本关是堆…

UEFI Shell命令(二)

一、Shell 命令行选项 ​-b, -break 每页输出后暂停一会&#xff0c;即分页输出 -q, -quiet 抑制所有的输出 -sfo 标准格式输出 -t, -terse 简洁的输出 -v, -verbose 详细的输出 -&#xff1f; 帮助 二、特殊Shell命令 1、attrib 显示或更改文件或目录的属性 [a | -a] 设置…