查看原文
其他

Apache Hudi 从零到一:揭秘类聚和空间填充曲线(六)

许世彦 DataFunSummit
2024-09-11


导读 本文介绍了 Apache Hudi 从零到一:揭秘类聚和空间填充曲线(六)。本文翻译自原英文博客 https://blog.datumagic.com/p/apache-hudi-from-zero-to-one-610

主要内容包括以下几个部分:

1. 概述

2. 聚类工作流

3. 优化布局策略

4. 回顾

分享嘉宾|许世彦 Onehouse 开源项目负责人

编辑整理|张阳

出品社区|DataFun


上一篇文章中,我们讨论了表服务的概念,包括压缩、清理和索引。现在,让我们继续深入探讨聚类(Clustering)服务。

01

概述

聚类在机器学习中是一种将数据点分门别类的技术,它能够揭示数据集中隐藏的结构。许多聚类算法通过特定的方法来衡量数据点之间的距离,从而确定它们属于哪个群体。在数据存储领域,我们可以把记录看作数据点,把物理文件看作群体。这样,聚类过程就像是把“相近”的记录归入同一个文件。这自然引出了两个问题:a)我们如何判断记录是否“相近”?b)为什么需要进行聚类?

让我们通过一个二维平面的类比来说明“相近性”的概念。在这个类比中,如果数据集有两个字段 X 和 Y,那么当这些记录的(X, Y)值对在二维平面上彼此接近时,我们认为这些记录是“相近”的。对于具有众多字段的宽表,我们相应地增加更多维度。虽然我们作为三维生物很难直观地理解高维空间,但我们仍然可以通过数学方法来确定记录的相近性,让计算机能够处理这些信息。

聚类是数据存储中的一种优化技术,通过保持数据的局部性来改善存储布局,从而提高读取效率。进行聚类主要有以下三个动机:

  • 低延迟高吞吐量的写入操作经常会产生大量小文件,这会影响查询性能。通过聚类任务合并这些小文件成较大的文件,可以有效解决这一问题,尤其是当这一任务与写入操作异步执行时。

  • 在重写数据文件的过程中,相近的记录更有可能被聚集到同一个文件中,这有助于实现数据跳过技术。聚类的记录与文件级别的统计数据(如列的最小/最大值)更加一致,使得基于给定条件的数据文件跳过更加高效。

  • 聚类数据的读取还可以利用缓存系统。空间局部性原理表明,访问某些数据元素后,其附近的数据元素很可能在不久的将来被访问。聚类数据展现出良好的局部性,利用块缓存(例如在HDFS中)可以提高命中率,从而实现更快的读取。

02

聚类工作流

第五篇博客提到的其他表服务类似,聚类可以以三种模式运行:内联、半异步和全异步。建议用户查阅官方文档,并根据需要配置相应的参数来控制运行模式。

hoodie.clustering.inlinehoodie.clustering.schedule.inlinehoodie.clustering.async.enabled
聚类涉及数据的重写,因此在表服务作业完成后,会生成一个 .replacecommit,表示符合条件的文件组已被重写为新的文件组。聚类工作流程包括调度和执行两个阶段,具体如下:

Hudi 聚类工作流

类聚的工作流程和压缩很相似。在调度阶段,根据 ClusteringPlanStrategy 选择符合条件的分区和文件切片。用户可以定义特定的分区模式(如使用正则表达式)来定位特定的分区。在这些分区内,满足特定条件的文件切片(比如不属于待定压缩计划的,或者符合小文件要求的)将被加入到 HoodieClusteringGroup 中。这些 HoodieClusteringGroup 存储了后续聚类执行所需的输入和输出信息。通常,HoodieClusteringGroup 会遵守大小限制,例如,重写时包含的文件切片的最大总字节数。默认情况下,HoodieClusteringGroup 的总数也有限制,以避免无意中提交资源密集型的聚类作业。

执行阶段包括以下步骤:

  • 反序列化聚类计划

  • 加载指定的输入文件切片

  • 合并加载的记录

  • 将合并后的记录批量插入到新的文件组

  • 通过返回的 WriteStatus 报告写入统计信息

用户可以通过提供自定义的 ClusteringExecutionStrategy 实现来定制执行过程。默认情况下,聚类计划中定义的每个 HoodieClusteringGroup 将作为一个独立的任务提交,以并行重写文件切片。

对于正在进行聚类操作的文件组,写入器默认会在这些文件组上执行更新或删除操作时中止。然而,在运行表服务时,写入失败可能不是理想的结果。Hudi 提供了其他可插拔的策略,允许更新继续进行,然后在旧的和新的文件组上解决冲突或执行双重写入。

我们已经展示了聚类工作流程作为 Hudi 表服务的一部分。但还有一个关键信息尚未提及:在概述中提到的记录“相近性”在聚类过程中是如何体现的?这发生在批量插入步骤中,记录会根据 hoodie.layout.optimize.strategy 重新分区和排序,我将在下一节中详细解释。

03

优化布局策略

Hudi 提供了三种布局优化策略:线性、Z 顺序和 Hilbert。这些策略定义了批量插入期间记录的排序方式。默认策略是线性,它执行字典排序。Z 顺序和 Hilbert 是空间填充曲线,它们在排序时可以保持良好的空间局部性。

线性策略非常适合于记录“相近性”仅依赖于单个列的数据集。例如,考虑一个包含交易时间戳的交易记录表。分析师们通常执行查询以获取特定时间范围内的所有记录。对于这样的记录来说,只要交易时间戳相近就被视为“相近”,线性策略通过按时间戳排序显著地保留了局部性,因此是一个很好的选择。

对于需要两个或更多列来确定记录“相近性”的数据集,线性策略可能表现不佳。以一个包含纬度和经度列的房屋库存数据集为例。如果仅按纬度的字典顺序排序,然后是经度,那么地理位置上相距遥远的房屋记录可能会因为纬度的接近性而被错误地分组在一起。在这种情况下,需要能够处理N维记录的排序算法。

空间填充曲线专门设计用于将 N 维点映射到一维。这种曲线在空间中穿行,触及所有可能的点以填充空间。一旦曲线被拉直,所有多维点都被映射到一维空间,并赋予单一值坐标。在众多曲线绘制方法中,Z 顺序和 Hilbert 是两种能够通过这种映射有效保持空间局部性的方法——曲线上的大多数附近点在原始空间中也彼此接近。

二维平面中的 Z 阶和希尔伯特曲线;来源:eisenwave.github.io

当我们把记录看作多维点时,绘制 Z 顺序或 Hilbert 曲线本质上定义了它们的排序方式。由于空间局部性得到了很好的保持,实际的“临近”记录更有可能存储在同一个文件中。这满足了本文概述中解释的相近性条件,并提高了读取效率。

04

回顾

在这篇文章中,我们详细讨论了聚类作为表服务的一部分,并探讨了空间填充曲线在聚类过程中如何优化存储以提高读取效率。欢迎关注 Hudi 公众号 ApacheHudi 获取微信群信息,加入钉钉群:35087066,发送空邮件至dev-subscribe@hudi.apache.org 参与讨论。
以上就是本次分享的内容,谢谢大家。



分享嘉宾

INTRODUCTION


许世彦

Onehouse

开源项目负责人

Onehouse 创始团队成员,开源项目负责人。Apache Hudi PMC 成员。

往期推荐


智能NPC的多维进化:腾讯在AI领域的探索与应用

让大模型更懂情感,我看到了巨大的市场潜力

大模型在小爱同学应用实践

基于 Doris 湖仓一体分析系统在快手的实践

金融大模型数据治理与应用创新

面向大规模向量数据的云原生存储解决方案:Milvus 向量数据库的经验

生成式AI带来的冲击与改变,我们讨论得还远远不够

多模态在京东内容算法上的应用

LLM+RAG:大模型在金融场景的落地探索

智能电销新纪元:大模型技术的应用与未来趋势


点个在看你最好看

SPRING HAS ARRIVED

继续滑动看下一个
DataFunSummit
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存