Apache Hudi数据跳过技术加速查询高达50倍

简介: Apache Hudi数据跳过技术加速查询高达50倍

介绍

在 Hudi 0.10 中,我们引入了对高级数据布局优化技术的支持,例如 Z-order和希尔伯特空间填充曲线[1](作为新的聚类算法),即使在经常使用过滤器查询大表的复杂场景中,也可以在多个列而非单个列上进行数据跳过。

但实际上什么是Data Skipping数据跳过?

随着存储在数据湖中的数据规模越来越大,数据跳过作为一种技术越来越受欢迎。数据跳过本质上是各种类型索引[2]的通用术语,使查询引擎能够有效地跳过数据,这与它当前执行的查询无关,以减少扫描和处理的数据量,节省扫描的数据量以及( 潜在地)显着提高执行时间。让我们以一个简单的非分区parquet表“sales”为例,它存储具有如下模式的记录:

此表的每个 parquet 文件自然会在每个相应列中存储一系列值,这些值与存储在此特定文件中的记录集相对应,并且对于每个列 parquet 将遵循自然顺序(例如,字符串、日期、整数等) 或推导一个(例如,复合数据类型 parquet 按字典顺序对它们进行排序,这也匹配其二进制表示的排序)。但是如果有一个排序和一个范围......还有最小值和最大值!现在意味着每个 Parquet 文件的每一列都有明确定义的最小值和最大值(也可以为 null)。最小值/最大值是所谓的列统计信息的示例 - 表征存储在列文件格式(如 Parquet)的单个列中的值范围的指标,比如

• 值的总数

• 空值的数量(连同总数,可以产生列的非空值的数量)

• 列中所有值的总大小(以字节为单位)(取决于使用的编码、压缩等)

配备了表征存储在每个文件的每个单独列中的一系列值的列统计信息,现在让我们整理下表:每一行将对应于一对文件名和列,并且对于每个这样的对,我们将写出相应的统计数据:最小值,最大值,计数,空计数:

这本质上是一个列统计索引!为方便起见我们对上表进行转置,使每一行对应一个文件,而每个统计列将分叉为每个数据列的自己的副本:

这种转置表示为数据跳过提供了一个非常明确的案例:对于由列统计索引索引的列 C1、C2、... 上的谓词 P1、P2、... 的查询 Q,我们可以根据存储在索引中的列统计信息评估这些谓词 P1、P2 等对于表的每个对应文件,以了解特定文件“file01”、“file02”等是否可能包含与谓词匹配的值。这种方法正是 Spark/Hive 和其他引擎所做的,例如,当他们从 Parquet 文件中读取数据时——每个单独的 Parquet 文件都存储自己的列统计信息(对于每一列),并且谓词过滤器被推送到 Parquet Reader 它能够评估所讨论的查询是否符合存储在列中(在文件中)的数据条件,从而避免在文件不包含任何与查询谓词匹配的数据的情况下对数据进行不必要的提取、解压缩和解码。但是如果 Parquet 已经存储了列统计信息,那么创建附加索引有什么意义呢?每个 Parquet 文件仅单独存储我们上面组合的索引中的一行。这种方法的明显缺点是,要了解哪些文件可能包含查询正在寻找的数据,查询引擎必须读取表中影响查询性能的每个 Parquet 文件的 Parquet 页脚(甚至可能导致来自云的限制[3])存储)与以更紧凑格式表示的专用索引相比。

Hudi 0.11 中的列统计索引和数据跳过

在 Hudi 0.10 中,我们引入了非常简单的列统计索引(存储为简单的 Parquet 表)的权宜之计实现,以支持 Hudi 中数据跳过实现的第一个版本,以展示 Z-order 和 Hilbert 的强大功能空间填充曲线作为高级布局优化技术。在 Hudi 0.11 中,我们在元数据表中引入了多模索引[4],例如布隆过滤器索引和列统计索引,这两者都实现为元数据表中的专用分区(分别为“column_stats”和“bloom_filters”)。虽然这些新索引仍处于试验阶段,但将列统计索引移动到元数据表中意味着更多:

• 强大的支持:列统计索引 (CSI) 现在还享有元数据表的一致性保证

• 高效实现:元数据表使用 HFile[5] 作为基础文件和日志文件格式,促进基于键的快速查找(排序键值存储)。实际上意味着对于具有大量列的大型表,我们不需要读取整个列统计索引,并且可以通过查找查询中引用的列来简单地投影其部分。

设计

在这里,我们将介绍新列统计索引设计的一些关键方面。如果您对更多详细信息感兴趣,请查看 RFC-27[6] 了解更多详细信息。列统计索引作为独立分区保留在元数据表中(指定为“column_stats”)。为了能够在保持灵活性的同时跟上最大表的规模,可以将索引配置为分片到多个文件组中,并根据其键值将单个记录散列到其中的任何一个中。要配置文件组的数量,请使用以下配置(默认值为 2):

如前所述,元数据表使用 HFile 作为其存储文件格式(这是一种非常有效的排序二进制键值格式),以便能够

• 有效地查找基于它们的键的记录以及

• 根据键的前缀有效地扫描记录范围

为了解释如何在列统计索引中使用它,让我们看一下它的记录键的组成:

用列前缀索引记录的键不是随机的,而是由以下观察引起的

• 通过 HFile 存储所有排序的键值对,这样的键组合提供了与特定列 C 相关的所有记录的局部性的良好属性

• 对原始表的任何给定查询通常只过滤少数列,这意味着我们可以通过避免读取完整索引来寻求效率,而是简单地将其连续切片投影到列 C1、C2 等查询过滤上

为了更好地举例说明,让我们看一下 C2 列上的查询 Q 过滤:

我们可以简单地读取一个连续的记录块,而无需 a) 读取整个索引(可能很大),也不需要 b) 随机寻找我们感兴趣的记录。这使我们能够在非常大的表上获得可观的性能改进。

基准测试

为了全面演示列统计索引和数据跳过功能,我们将使用众所周知的 Amazon 评论数据集(仅占用 50Gb 存储空间),以便任何人都可以轻松复制我们的结果,但是使用稍微不常见的摄取配置来展示列统计索引和数据跳过带来的效率如何随着数据集中的文件数量而变化。

摄取

为了将 Amazon 评论数据集提取到 Hudi 表中,我们使用了这个gist[7]。请注意,您必须指定以下配置属性以确保在摄取期间同步构建列统计索引:

但是,如果您想在当前没有列统计索引的现有表上运行实验,您可以利用异步索引器功能回填现有表的索引。

查询

请注意要查看数据跳过操作,需要执行以下操作:

• 确保在读取路径上启用了元数据表

• 数据跳过功能已启用

为此必须将以下 2 个属性指定为 Spark 或 Hudi 选项:

默认情况下元数据表仅在写入端启用,如果读者愿意在读取路径上利用元数据表,他们仍然必须明确指定相应的配置 请查看此gist[8]以了解如何查询先前摄取的数据集。

EMR 配置

所有测试都在具有以下配置的小型 EMR 集群上执行,如果您选择这样做可以轻松地重现相同的结果。节点:m5.xlarge(1 个 master / 3 个 executor) Spark:OSS 3.2.1(Hadoop 3.2)

运行非分区 COW 表

请注意我们故意压缩文件大小以生成大量有意义的文件,因为数据集只有 50Gb。

• 数据集:亚马逊评论(约 50Gb 未压缩)

• 记录:161M(~160 字节)

• 表类型:COW(非分区)

• 文件大小:1Mb

• 文件数:~39k(总大小~47Gb,压缩,zstd)

• 列统计:21 列(~847k 记录,~63 Mb)

• 预热:否(冷缓存,每次都重新启动 shell 以刷新任何缓存)

从上表中可以很容易地看出,由 Hudi 0.11 中的新列统计索引提供支持的数据跳过显着提高了查询的执行性能(与其修剪潜力成正比),减少了执行运行时间并节省了关键的计算资源 直接转化为基于 Hudi 的基于云的 Lakes 和 Lakehouses 的成本节约。尽管现在 Hudi 用户已经可以使用列统计索引和数据跳过的功能,但目前还有更多工作要做:

• 支持 Merge-On-Read 表中的数据跳过

• 为列统计索引查询添加缓存

• 进一步分析和优化列统计索引性能

如果您想关注当前正在进行的工作,请查看 HUDI-1822[9] 并留下您的评论。

目录
相关文章
|
2月前
|
消息中间件 资源调度 API
Apache Flink 流批融合技术介绍
本文源自阿里云高级研发工程师周云峰在Apache Asia Community OverCode 2024的分享,内容涵盖从“流批一体”到“流批融合”的演进、技术解决方案及社区进展。流批一体已在API、算子和引擎层面实现统一,但用户仍需手动配置作业模式。流批融合旨在通过动态调整优化策略,自动适应不同场景需求。文章详细介绍了如何通过量化指标(如isProcessingBacklog和isInsertOnly)实现这一目标,并展示了针对不同场景的具体优化措施。此外,还概述了社区当前进展及未来规划,包括将优化方案推向Flink社区、动态调整算子流程结构等。
400 31
Apache Flink 流批融合技术介绍
|
1月前
|
存储 分布式计算 druid
大数据-149 Apache Druid 基本介绍 技术特点 应用场景
大数据-149 Apache Druid 基本介绍 技术特点 应用场景
58 1
大数据-149 Apache Druid 基本介绍 技术特点 应用场景
|
2月前
|
存储 JSON 物联网
查询性能提升 10 倍、存储空间节省 65%,Apache Doris 半结构化数据分析方案及典型场景
本文我们将聚焦企业最普遍使用的 JSON 数据,分别介绍业界传统方案以及 Apache Doris 半结构化数据存储分析的三种方案,并通过图表直观展示这些方案的优势与不足。同时,结合具体应用场景,分享不同需求场景下的使用方式,帮助用户快速选择最合适的 JSON 数据存储及分析方案。
查询性能提升 10 倍、存储空间节省 65%,Apache Doris 半结构化数据分析方案及典型场景
|
1月前
|
SQL 消息中间件 大数据
大数据-159 Apache Kylin 构建Cube 准备和测试数据(一)
大数据-159 Apache Kylin 构建Cube 准备和测试数据(一)
52 1
|
1月前
|
SQL 大数据 Apache
大数据-159 Apache Kylin 构建Cube 准备和测试数据(二)
大数据-159 Apache Kylin 构建Cube 准备和测试数据(二)
81 1
|
1月前
|
分布式计算 监控 大数据
大数据-148 Apache Kudu 从 Flink 下沉数据到 Kudu
大数据-148 Apache Kudu 从 Flink 下沉数据到 Kudu
57 1
|
3月前
|
存储 消息中间件 人工智能
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
早期 MiniMax 基于 Grafana Loki 构建了日志系统,在资源消耗、写入性能及系统稳定性上都面临巨大的挑战。为此 MiniMax 开始寻找全新的日志系统方案,并基于阿里云数据库 SelectDB 版内核 Apache Doris 升级了日志系统,新系统已接入 MiniMax 内部所有业务线日志数据,数据规模为 PB 级, 整体可用性达到 99.9% 以上,10 亿级日志数据的检索速度可实现秒级响应。
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
|
2月前
|
存储 大数据 数据挖掘
【数据新纪元】Apache Doris:重塑实时分析性能,解锁大数据处理新速度,引爆数据价值潜能!
【9月更文挑战第5天】Apache Doris以其卓越的性能、灵活的架构和高效的数据处理能力,正在重塑实时分析的性能极限,解锁大数据处理的新速度,引爆数据价值的无限潜能。在未来的发展中,我们有理由相信Apache Doris将继续引领数据处理的潮流,为企业提供更快速、更准确、更智能的数据洞察和决策支持。让我们携手并进,共同探索数据新纪元的无限可能!
145 11
|
2月前
|
分布式计算 Java Apache
Apache Spark Streaming技术深度解析
【9月更文挑战第4天】Apache Spark Streaming是Apache Spark生态系统中用于处理实时数据流的一个重要组件。它将输入数据分成小批次(micro-batch),然后利用Spark的批处理引擎进行处理,从而结合了批处理和流处理的优点。这种处理方式使得Spark Streaming既能够保持高吞吐量,又能够处理实时数据流。
71 0
|
1月前
|
SQL Java API
Apache Flink 2.0-preview released
Apache Flink 社区正积极筹备 Flink 2.0 的发布,这是自 Flink 1.0 发布以来的首个重大更新。Flink 2.0 将引入多项激动人心的功能和改进,包括存算分离状态管理、物化表、批作业自适应执行等,同时也包含了一些不兼容的变更。目前提供的预览版旨在让用户提前尝试新功能并收集反馈,但不建议在生产环境中使用。
618 13
Apache Flink 2.0-preview released

推荐镜像

更多