Apache Hudi数据跳过技术加速查询高达50倍
介绍
在 Hudi 0.10 中,我们引入了对高级数据布局优化技术的支持,例如 Z-order和希尔伯特空间填充曲线(作为新的聚类算法),即使在经常使用过滤器查询大表的复杂场景中,也可以在多个列而非单个列上进行数据跳过。
但实际上什么是Data Skipping数据跳过?
随着存储在数据湖中的数据规模越来越大,数据跳过作为一种技术越来越受欢迎。 数据跳过本质上是各种类型索引的通用术语,使查询引擎能够有效地跳过数据,这与它当前执行的查询无关,以减少扫描和处理的数据量,节省扫描的数据量以及( 潜在地)显着提高执行时间。 让我们以一个简单的非分区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 页脚(甚至可能导致来自云的限制)存储)与以更紧凑格式表示的专用索引相比。
Hudi 0.11 中的列统计索引和数据跳过
在 Hudi 0.10 中,我们引入了非常简单的列统计索引(存储为简单的 Parquet 表)的权宜之计实现,以支持 Hudi 中数据跳过实现的第一个版本,以展示 Z-order 和 Hilbert 的强大功能空间填充曲线作为高级布局优化技术。
在 Hudi 0.11 中,我们在元数据表中引入了多模索引,例如布隆过滤器索引和列统计索引,这两者都实现为元数据表中的专用分区(分别为“column_stats”和“bloom_filters”)。虽然这些新索引仍处于试验阶段,但将列统计索引移动到元数据表中意味着更多:
- 强大的支持:列统计索引 (CSI) 现在还享有元数据表的一致性保证
- 高效实现:元数据表使用 HFile 作为基础文件和日志文件格式,促进基于键的快速查找(排序键值存储)。实际上意味着对于具有大量列的大型表,我们不需要读取整个列统计索引,并且可以通过查找查询中引用的列来简单地投影其部分。
设计
在这里,我们将介绍新列统计索引设计的一些关键方面。如果您对更多详细信息感兴趣,请查看 RFC-27 了解更多详细信息。
列统计索引作为独立分区保留在元数据表中(指定为“column_stats”)。为了能够在保持灵活性的同时跟上最大表的规模,可以将索引配置为分片到多个文件组中,并根据其键值将单个记录散列到其中的任何一个中。要配置文件组的数量,请使用以下配置(默认值为 2):

如前所述,元数据表使用 HFile 作为其存储文件格式(这是一种非常有效的排序二进制键值格式),以便能够
- 有效地查找基于它们的键的记录以及
- 根据键的前缀有效地扫描记录范围
为了解释如何在列统计索引中使用它,让我们看一下它的记录键的组成:

用列前缀索引记录的键不是随机的,而是由以下观察引起的
- 通过 HFile 存储所有排序的键值对,这样的键组合提供了与特定列 C 相关的所有记录的局部性的良好属性
- 对原始表的任何给定查询通常只过滤少数列,这意味着我们可以通过避免读取完整索引来寻求效率,而是简单地将其连续切片投影到列 C1、C2 等查询过滤上
为了更好地举例说明,让我们看一下 C2 列上的查询 Q 过滤:

我们可以简单地读取一个连续的记录块,而无需 a) 读取整个索引(可能很大),也不需要 b) 随机寻找我们感兴趣的记录。这使我们能够在非常大的表上获得可观的性能改进。
基准测试
为了全面演示列统计索引和数据跳过功能,我们将使用众所周知的 Amazon 评论数据集(仅占用 50Gb 存储空间),以便任何人都可以轻松复制我们的结果,但是使用稍微不常见的摄取配置来展示列统计索引和数据跳过带来的效率如何随着数据集中的文件数量而变化。
摄取
为了将 Amazon 评论数据集提取到 Hudi 表中,我们使用了这个gist。
请注意,您必须指定以下配置属性以确保在摄取期间同步构建列统计索引:

但是,如果您想在当前没有列统计索引的现有表上运行实验,您可以利用异步索引器功能回填现有表的索引。
查询
请注意要查看数据跳过操作,需要执行以下操作:
- 确保在读取路径上启用了元数据表
- 数据跳过功能已启用
为此必须将以下 2 个属性指定为 Spark 或 Hudi 选项:

默认情况下元数据表仅在写入端启用,如果读者愿意在读取路径上利用元数据表,他们仍然必须明确指定相应的配置
请查看此gist以了解如何查询先前摄取的数据集。
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 并留下您的评论。
Apache Hudi数据跳过技术加速查询高达50倍的更多相关文章
- 基于Apache Hudi 的CDC数据入湖
作者:李少锋 文章目录: 一.CDC背景介绍 二.CDC数据入湖 三.Hudi核心设计 四.Hudi未来规划 1. CDC背景介绍 首先我们介绍什么是CDC?CDC的全称是Change data Ca ...
- 超级重磅!Apache Hudi多模索引对查询优化高达30倍
与许多其他事务数据系统一样,索引一直是 Apache Hudi 不可或缺的一部分,并且与普通表格式抽象不同. 在这篇博客中,我们讨论了我们如何重新构想索引并在 Apache Hudi 0.11.0 版 ...
- 干货!Apache Hudi如何智能处理小文件问题
1. 引入 Apache Hudi是一个流行的开源的数据湖框架,Hudi提供的一个非常重要的特性是自动管理文件大小,而不用用户干预.大量的小文件将会导致很差的查询分析性能,因为查询引擎执行查询时需要进 ...
- Apache Hudi助力nClouds加速数据交付
1. 概述 在nClouds上,当客户的业务决策取决于对近实时数据的访问时,客户通常会向我们寻求有关数据和分析平台的解决方案.但随着每天创建和收集的数据量都在增加,这使得使用传统技术进行数据分析成为一 ...
- 通过Apache Hudi和Alluxio建设高性能数据湖
T3出行的杨华和张永旭描述了他们数据湖架构的发展.该架构使用了众多开源技术,包括Apache Hudi和Alluxio.在本文中,您将看到我们如何使用Hudi和Alluxio将数据摄取时间缩短一半.此 ...
- 使用Apache Hudi + Amazon S3 + Amazon EMR + AWS DMS构建数据湖
1. 引入 数据湖使组织能够在更短的时间内利用多个源的数据,而不同角色用户可以以不同的方式协作和分析数据,从而实现更好.更快的决策.Amazon Simple Storage Service(amaz ...
- 对话Apache Hudi VP, 洞悉数据湖的过去现在和未来
Apache Hudi是一个开源数据湖管理平台,用于简化增量数据处理和数据管道开发,该平台可以有效地管理业务需求,例如数据生命周期,并提高数据质量.Hudi的一些常见用例是记录级的插入.更新和删除.简 ...
- 通过Z-Order技术加速Hudi大规模数据集分析方案
1. 背景 多维分析是大数据分析的一个典型场景,这种分析一般带有过滤条件.对于此类查询,尤其是在高基字段的过滤查询,理论上只我们对原始数据做合理的布局,结合相关过滤条件,查询引擎可以过滤掉大量不相关数 ...
- 基于Apache Hudi构建数据湖的典型应用场景介绍
1. 传统数据湖存在的问题与挑战 传统数据湖解决方案中,常用Hive来构建T+1级别的数据仓库,通过HDFS存储实现海量数据的存储与水平扩容,通过Hive实现元数据的管理以及数据操作的SQL化.虽然能 ...
随机推荐
- Git在项目中使用技巧
1.常用的命令 mkdir 文件夹名 创建文件夹 clear 清楚屏幕 ls或者ll 将当前目录下的子文件和子目录平铺在控制台 find 目录名 将对应目录下的子孙文件或子孙目录平铺在控制台 rm 文 ...
- 基本命令学习 -(3)Linux压缩和解压缩命令汇总
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 前言 Linux下的压缩和解压缩工具比较多,有时经常记不住,这里给大家汇总一下,方便大家查阅. ...
- Web3.0应用程序架构
Web 3.0 应用程序(或"DApps")的架构与 Web 2.0 应用程序完全不同. 以博客园为例,这是一个简洁的博客网站,用户可以发布自己的内容并可以评论他人的内容进行互动. ...
- 最新管家婆财贸ERP C9 V22.0的应用网页版的财务软件1000用户补丁免狗授权注册机网络版软件下载
管家婆财贸ERPC9应用价值: 1.多组织独立核算 多种组织形态核算,出具独立的三大财务报表及业务报表,发挥经营管理的积极性,便于专业化运营. 2.兼顾统筹与分权 满足多种集团统管与分权管控模式需求, ...
- 精彩分享 | 欢乐游戏 Istio 云原生服务网格三年实践思考
作者 吴连火,腾讯游戏专家开发工程师,负责欢乐游戏大规模分布式服务器架构.有十余年微服务架构经验,擅长分布式系统领域,有丰富的高性能高可用实践经验,目前正带领团队完成云原生技术栈的全面转型. 导语 欢 ...
- (原创)[C#] MEF 主程序与插件加载不同版本的DLL
一.前言 MEF(Managed Extensibility Framework),是轻量级的插件框架.使用简单,功能强大.详细介绍见MSDN,本文不再赘述. 在使用MEF时,会遇到这样一种场景: 主 ...
- drools决策表的简单使用
目录 一.背景 二.一个简单的决策表 1.在同一个决策表中处理多个Sheet页 2.RuleSet下方可以有哪些属性 3.RuleTable下方可以有哪些属性 4.规则属性的编写 三.需求 四.实现 ...
- JDK1.7HashMap源码分析
1.1首先HashMap中的Hash(哈希)是什么? Hash也称散列,哈希,对应的英文都是Hash.基本原理就是把任意长度的输入通过Hash算法变成固定长度的输出,这个映射的规则就是对应的Ha ...
- Jmeter接口参数化<自动化>(csv文件)管理测试用例以及断言
1.创建相关线程组(不解释) 2.创建相应的请求(在请求中设置变量) 下面截图中①②③④⑤⑥⑦皆可以设置为变量 3.新建CSV文件 将请求中设置的变量为明确了解每个字段的含义(皆可以将变量填写到列表的 ...
- 机器学习中 TP FP TN FN的概念
二分类 在二分类问题中,TP FP TN FN 是非常清楚且易于理解的. TP (True Positive) : 预测为 1 ,真实值也为 1 -> 真阳性 FP (False Positiv ...