技术干货|一文彻底理解Apache Hudi的清理服务

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: Apache Hudi与Apache Pulsar联合Meetup杭州站来啦!将于2021年8月28日(本周六)13:30,在杭州正式召开,你准备好了吗?

Apache Hudi与Apache Pulsar联合Meetup杭州站来啦!将于2021年8月28日(本周六)13:30,在杭州正式召开,你准备好了吗?


戳链接即可免费报名

🔗速来报名|Apache Hudi x Pulsar Meetup杭州站火爆来袭,实践干货就等你来


截屏2021-08-24 下午4.30.05.png


Apache Hudi提供了MVCC并发模型,保证写入端和读取端之间快照级别隔离。在本篇博客中我们将介绍如何配置来管理多个文件版本,此外还将讨论用户可使用的清理机制,以了解如何维护所需数量的旧文件版本,以使长时间运行的读取端不会失败。


1. 回收空间以控制存储成本


Hudi 提供不同的表管理服务来管理数据湖上表的数据,其中一项服务称为Cleaner(清理服务)。随着用户向表中写入更多数据,对于每次更新,Hudi会生成一个新版本的数据文件用于保存更新后的记录(COPY_ON_WRITE) 或将这些增量更新写入日志文件以避免重写更新版本的数据文件 (MERGE_ON_READ)。在这种情况下,根据更新频率,文件版本数可能会无限增长,但如果不需要保留无限的历史记录,则必须有一个流程(服务)来回收旧版本的数据,这就是 Hudi 的清理服务。


2. 问题描述


在数据湖架构中,读取端和写入端同时访问同一张表是非常常见的场景。由于 Hudi 清理服务会定期回收较旧的文件版本,因此可能会出现长时间运行的查询访问到被清理服务回收的文件版本的情况,因此需要使用正确的配置来确保查询不会失败。


3. 深入了解 Hudi清理服务


针对上述场景,我们先了解一下 Hudi 提供的不同清理策略以及需要配置的相应属性,Hudi提供了异步或同步清理两种方式。在详细介绍之前我们先解释一些基本概念:


  • Hudi 基础文件(HoodieBaseFile):由压缩后的最终数据组成的列式文件,基本文件的名称遵循以下命名约定:__.parquet。在此文件的后续写入中文件 ID 保持不变,并且提交时间会更新以显示最新版本。这也意味着记录的任何特定版本,给定其分区路径,都可以使用文件 ID 和 instantTime进行唯一定位。


  • **文件切片(FileSlice)**:在 MERGE_ON_READ 表类型的情况下,文件切片由基本文件和由多个增量日志文件组成。


  • **Hudi 文件组(FileGroup)**:Hudi 中的任何文件组都由分区路径和文件ID 唯一标识,该组中的文件作为其名称的一部分。文件组由特定分区路径中的所有文件片组成。此外任何分区路径都可以有多个文件组。


4. 清理服务


Hudi 清理服务目前支持以下清理策略:


  • KEEP_LATEST_COMMITS:这是默认策略。该清理策略可确保回溯前X次提交中发生的所有更改。假设每 30 分钟将数据摄取到 Hudi 数据集,并且最长的运行查询可能需要 5 小时才能完成,那么用户应该至少保留最后 10 次提交。通过这样的配置,我们确保文件的最旧版本在磁盘上保留至少 5 小时,从而防止运行时间最长的查询在任何时间点失败,使用此策略也可以进行增量清理。


  • KEEP_LATEST_FILE_VERSIONS:此策略具有保持 N 个文件版本而不受时间限制的效果。当知道在任何给定时间想要保留多少个 MAX 版本的文件时,此策略很有用,为了实现与以前相同的防止长时间运行的查询失败的行为,应该根据数据模式进行计算,或者如果用户只想维护文件的 1 个最新版本,此策略也很有用。


5. 例子


假设用户每 30 分钟将数据摄取到 COPY_ON_WRITE 类型的 Hudi 数据集,如下所示:


2.jpg

图1:每30分钟将传入的记录提取到hudi数据集中


该图显示了 DFS 上的一个特定分区,其中提交和相应的文件版本是彩色编码的。在该分区中创建了 4 个不同的文件组,如 fileId1、fileId2、fileId3 和 fileId4 所示。fileId2 对应的文件组包含所有 5 次提交的记录,而 fileId4 对应的组仅包含最近 2 次提交的记录。


假设使用以下配置进行清理:


hoodie.cleaner.policy=KEEP_LATEST_COMMITS
hoodie.cleaner.commits.retained=2


Cleaner 通过处理以下事项来选择要清理的文件版本:


  • 不应清理文件的最新版本。
  • 确定最后 2 次(已配置)+ 1 次提交的提交时间。在图 1 中,commit 10:30commit 10:00 对应于时间线中最新的 2 个提交。包含一个额外的提交,因为保留提交的时间窗口本质上等于最长的查询运行时间。因此如果最长的查询需要 1 小时才能完成,并且每 30 分钟发生一次摄取,则您需要保留自 2*30 = 60(1 小时)以来的最后 2 次提交。此时最长的查询仍然可以使用以相反顺序在第 3 次提交中写入的文件。这意味着如果一个查询在 commit 9:30 之后开始执行,当在 commit 10:30 之后触发清理操作时,它仍然会运行,如图 2 所示。
  • 现在对于任何文件组,只有那些没有保存点(另一个 Hudi 表服务)且提交时间小于第 3 次提交(下图中的“提交 9:30”)的文件切片被清理。


1.jpg

图2:保留最近3次提交对应的文件


假设使用以下配置进行清理:


hoodie.cleaner.policy=KEEP_LATEST_FILE_VERSIONS
hoodie.cleaner.fileversions.retained=1


清理服务执行以下操作:


  • 对于任何文件组,文件切片的最新版本(包括任何待压缩的)被保留,其余的清理掉。如图 3 所示,如果在 commit 10:30 之后立即触发清理操作,清理服务将简单地保留每个文件组中的最新版本并删除其余的。


1.jpg

图3:保留每个文件组中的最新文件版本


6. 配置


可以在 此处[1] 中找到有关所有可能配置的详细信息以及默认值。


7. 运行命令


Hudi 的清理表服务可以作为单独的进程运行,可以与数据摄取一起运行。正如前面提到的,它会清除了任何陈旧文件。如果您想将它与摄取数据一起运行,可以使用配置同步或异步运行[2]。或者可以使用以下命令独立运行清理服务:


[hoodie]$ spark-submit --class org.apache.hudi.utilities.HoodieCleaner \
  --props s3:///temp/hudi-ingestion-config/config.properties \
  --target-base-path s3:///temp/hudi \
  --spark-master yarn-cluster


如果您希望与写入异步运行清理服务,可以配置如下内容:


hoodie.clean.automatic=true
hoodie.clean.async=true


此外还可以使用 Hudi CLI[3] 来管理 Hudi 数据集。CLI 为清理服务提供了以下命令:


  • cleans show
  • clean showpartitions
  • clean run


可以在 org.apache.hudi.cli.commands.CleansCommand[4] 中找到这些命令的更多详细信息和相关代码。


8. 未来计划


目前正在进行根据已流逝的时间间隔引入新的清理策略,即无论摄取发生的频率如何,都可以保留想要的文件版本,可以在 此处[5] 跟踪进度。


我们希望这篇博客能让您了解如何配置 Hudi 清理服务和支持的清理策略。请访问博客部分[6] 以更深入地了解各种 Hudi 概念。


活动预告:


Apache Hudi与Apache Pulsar联合Meetup杭州站也将于2021年8月28日(周六)13:30,在杭州西湖区华策中心A座12层正式召开。目前活动正在火爆进行中,戳链接或扫描下方二维码,即可免费报名:


🔗速来报名|Apache Hudi x Pulsar Meetup杭州站火爆来袭,实践干货就等你来


1.jpg


引用链接:

[1] 此处: https://hudi.apache.org/docs/configurations.html#compaction-configs

[2] 同步或异步运行: https://hudi.apache.org/docs/configurations.html#withAsyncClean

[3] Hudi CLI: https://hudi.apache.org/docs/deployment.html#cli

[4]org.apache.hudi.cli.commands.CleansCommand 类: https://github.com/apache/hudi/blob/master/hudi-cli/

[5] 此处: https://issues.apache.org/jira/browse/HUDI-349

[6] 博客部分: https://hudi.apache.org/blog.html


推荐阅读:

对话Apache Hudi VP,洞悉数据湖的过去现在和未来

基于 Apache Hudi 构建实时数据湖在百信银行的实践

17张图带你彻底理解Hudi Upsert原理

恭喜!Apache Hudi社区新晋顶级互联网公司的PMC和Committer

基于Apache Hudi 湖仓一体的大数据生态体系



相关文章
|
10月前
|
分布式计算 测试技术 Apache
探索Apache Hudi核心概念 (3) - Compaction
探索Apache Hudi核心概念 (3) - Compaction
171 5
|
10月前
|
存储 消息中间件 Kafka
Hudi 压缩(Compaction)实现分析
Hudi 压缩(Compaction)实现分析
315 1
|
10月前
|
存储 Apache
Apache Hudi Savepoint实现分析
Apache Hudi Savepoint实现分析
152 0
|
算法 Apache C++
干货!Apache Hudi如何智能处理小文件问题
Apache Hudi是一个流行的开源的数据湖框架,Hudi提供的一个非常重要的特性是自动管理文件大小,而不用用户干预。大量的小文件将会导致很差的查询分析性能,因为查询引擎执行查询时需要进行太多次文件的打开/读取/关闭。在流式场景中不断摄取数据,如果不进行处理,会产生很多小文件。
579 0
干货!Apache Hudi如何智能处理小文件问题
|
10月前
|
关系型数据库 MySQL Java
Flink问题之数据清理如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
168 0
|
10月前
|
Apache
Apache Hudi Rollback实现分析
Apache Hudi Rollback实现分析
124 0
|
9月前
|
消息中间件 Java Kafka
实时计算 Flink版操作报错合集之从hudi读数据,报错NoSuchMethodError:org.apache.hudi.format.cow.vector.reader.PaequetColumnarRowSplit.getRecord(),该怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
154 0
|
10月前
|
消息中间件 分布式计算 Apache
从 Apache Kudu 迁移到 Apache Hudi
从 Apache Kudu 迁移到 Apache Hudi
194 3
|
10月前
|
存储 Apache
一文彻底理解Apache Hudi的清理服务
一文彻底理解Apache Hudi的清理服务
101 0
|
10月前
|
分布式计算 Apache 调度
Apache Hudi 异步Compaction部署方式汇总
Apache Hudi 异步Compaction部署方式汇总
180 0

推荐镜像

更多