元数据表的作用
ApacheHudi元数据表可以显著提高查询的读/写性能。元数据表的主要目的是消除“列出文件”操作的要求。
读取和写入数据时,会执行文件列表操作,以获取文件系统的当前视图。当数据集较大时,列出所有文件可能是性能瓶颈,但更重要的是,在AWS S3等云存储系统中,由于某些请求限制,大量文件列出请求有时会导致限制。元数据表将主动维护文件列表,并消除递归文件列表操作的需要。
相关测试
运行TPCDS基准测试时,单个文件夹的p50列表延迟与文件/对象的数量成线性关系:
Number of files/objects | 100 | 1K | 10K | 100K |
---|---|---|---|---|
P50 list latency | 50ms | 131ms | 1062ms | 9932ms |
然而,元数据表中的列表不会随着文件/对象计数线性扩展,而是每次读取大约需要100-500毫秒,即使对于非常大的表也是如此。更棒的是,timeline服务器缓存了部分元数据(目前仅针对writers),并为列表提供了约10毫秒的性能。
支持多模态索引
多模式索引可以极大地提高文件索引中的查找性能和数据跳过时的查询延迟。包含文件级Bloom过滤器的Bloom过滤器索引有助于key查找和文件修剪。包含所有列的统计信息的column stats索引改进了基于写入程序和读取程序中的键和列值范围的文件修剪,例如Spark中的查询规划。多模式索引被实现为包含元数据表中的索引的独立分区。
启用Hudi元数据表和多模式索引
在 0.11.0 中,默认启用具有同步更新和基于元数据表的文件列表的元数据表。 部署注意事项中有一些先决条件配置和步骤,可以安全地使用此功能。 元数据表和相关文件列表功能仍然可以通过将 hoodie.metadata.enable 设置为 false 来关闭。 对于 0.10.1 及之前的版本,默认情况下禁用元数据表,您可以通过将相同的配置设置为 true 来打开它。
如果在启用后关闭元数据表,请确保在再次启用元数据表之前等待几次提交,以便元数据表被完全清理。
多模式索引在 0.11.0 版本中引入。 默认情况下它们被禁用。 启用元数据表时,您可以通过将 hoodie.metadata.index.bloom.filter.enable 设置为 true 来选择启用布隆过滤器索引,并通过将 hoodie.metadata.index.column.stats.enable 设置为 true 来启用列统计索引。 在 0.11.0 版本中,Spark 中改进查询的数据跳过现在依赖于元数据表中的列统计索引。 启用元数据表和列统计索引是使用 hoodie.enable.data.skipping 启用数据跳过的先决条件。
部署注意事项
为了确保元数据表保持最新,在不同的部署模型中,同一Hudi表上的所有写操作都需要额外的配置。在启用元数据表之前,必须停止同一表上的所有写入程序。
部署模型A:带内联表服务的单writer
如果您当前的部署模型是单写入器,并且所有表服务(清理、集群、压缩)都配置为内联,例如 Deltastreamer 同步一次模式和具有默认配置的 Spark 数据源,则无需额外配置。 将 hoodie.metadata.enable 设置为 true 后,重新启动单个 writer 足以安全地启用元数据表。
部署模型 B:具有异步表服务的单个写入器
如果您当前的部署模型是单写入器以及在同一进程中运行的异步表服务(例如清理、集群、压缩),例如 Deltastreamer 连续模式写入 MOR 表、Spark 流(其中压缩默认为异步),以及您的作业设置在同一个编写器中启用异步表服务,在启用元数据表之前,必须配置乐观并发控制、锁提供程序和惰性失败写入清理策略,如下所示。这是为了在启用元数据表时保证乐观并发控制的正确行为。 不遵循配置指南会导致数据丢失。 请注意,仅当在此部署模型中启用了元数据表时,才需要这些配置。
hoodie.write.concurrency.mode=optimistic_concurrency_control
hoodie.cleaner.policy.failed.writes=LAZY
hoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.InProcessLockProvider
如果存在多个不同进程的写入器,包括一个带有异步表服务的写入器,请参阅部署模型 C:配置的多写入器,与使用分布式锁提供程序的区别。请注意,在writer之外运行单独的压缩 (HoodieCompactor) 或集群 (HoodieClusteringJob) 作业被视为多writer部署,因为他们不能依赖进程锁而在同一个进程中运行。
部署模型C:多写入器
如果你当前的部署模式是基于锁的多写入器模式,那么您需要对所有写入器配置如下选项。您可以在停止写入器以启动元数据表之后按顺序启动写入器。如果你只对部分写入器配置如下参数,那么会导致数据丢失,所以,请确保为每个写入器启动元数据表。
hoodie.write.concurrency.mode=optimistic_concurrency_control
hoodie.cleaner.policy.failed.writes=LAZY
hoodie.write.lock.provider=<distributed-lock-provider-classname>
请注意,有3种不同的分布式锁提供程序可供选择:ZookePerBasedLockProvider、HiveMetastoreBasedLockProvider和DynamodBBbasedLockProvider。
本文为从大数据到人工智能博主「xiaozhch5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://lrting.top/backend/bigdata/hudi/hudi-basic/4602/