0
48
0
0
首页/专栏/ 技术分享/ 查看内容

使用 ClickHouse 实现 Medallion 架构

 admin   发表于  2025-1-13 17:30
专栏 技术分享



在大规模数据工程中,高效地整理、转换和分析数据集是核心任务。Medallion 架构是一种广泛应用的数据工作流设计模式,利用分层转换方法来组织数据并提高其质量。传统上,人们使用 Spark 和 Delta Lake 等工具来实现这一流程,从原始、杂乱的数据中系统地提取出干净且高质量的数据集,供最终用户分析和使用。

本文将探讨如何通过原生的 ClickHouse 功能来实现 Medallion 架构,从而完全摆脱对外部框架或工具的依赖。凭借其卓越的查询性能、对多种数据格式的广泛支持,以及内置的数据管理与转换能力,ClickHouse 可以高效支持该架构的每个阶段。

本文主要从理论上介绍如何使用 ClickHouse 构建 Medallion 架构的三个阶段。在后续文章中,我们将通过 Bluesky 数据集的实时流,实际演示这一过程。Bluesky 数据集包含许多常见的数据问题,例如事件格式错误、高重复率和时间戳不一致,是展示本文所述流程的理想案例。


什么是 Medallion 架构?

Medallion 架构是一种被广泛采用的数据工作流设计模式,通过分层结构逐步提升数据质量。在这一架构中,数据会依次经过不同的处理阶段,最终转变为高质量数据。虽然 Medallion 架构常用于数据湖仓 (data lake house),但它也适用于实时数据仓库,可用于实现高效的数据管理与转换。

这一架构分为三个主要层级 (或阶段),每一层在数据管道中都承担着不同的任务:

  • Bronze 层 - 这一层是原始数据的“着陆区”,直接从数据源导入,类似“暂存区”。数据以其原始结构存储,仅经过最小化的转换,并附加了必要的元数据。该层设计侧重于快速的数据摄取,同时还充当源数据的历史存档,可随时用于重新处理或调试。

关于是否需要在 Bronze 层存储所有数据,业界尚有争议。一些用户倾向于对数据进行初步处理,例如展平 JSON、重命名字段或过滤掉不合格的数据。我们建议将此层优化为仅供 Silver 层使用,而不是直接为其他消费者提供数据。
  • Silver 层 - 在 Silver 层,数据会被清洗、去重并统一到一个标准化的模式中。通过对来自 Bronze 层的原始数据进行丰富和转换,这一阶段为机器学习、分析等企业级用例提供了一致性更强的数据视图。此时,数据模型开始形成,需确保主键和外键一致,以简化后续的关联操作。尽管少数情况下某些应用或消费者会直接使用该层数据,但大多数情况下,它更适合作为清洗后数据的中间层,供业务应用全面使用。

  • Gold 层 - Gold 层是整个架构的终极目标,提供精心策划的、面向业务需求的、专门化的数据集。这些数据集通常是去规范化或预聚合的,旨在优化读取性能,可能由 Silver 层的多个表构建而成。此阶段的核心是完成最终的数据转换,并确保数据达到最高质量,以满足终端用户或应用场景的需求,例如报告或用户界面仪表板。


这种分层的数据管道设计可以有效解决数据质量、重复性以及模式不一致等问题。通过逐步处理原始数据,Medallion 架构能够确保清晰的数据血缘,并生产出逐步优化的数据集,以满足分析或操作需求。

尽管 Medallion 架构的命名未能直接反映各层的内容,但其分层设计和流程规范为数据管理提供了很大的价值。


使用 ClickHouse 构建 Medallion 架构

在本节中,我们将分享如何使用 ClickHouse 实现 Medallion 架构中的各个层级,并利用其原生特性在这些层级之间流转数据。这种方法灵活且可扩展,基于我们的内部经验和用户反馈不断优化。我们也非常欢迎读者提出意见,共同完善这一实践。


使用 ClickHouse 构建 Bronze 层

Bronze 层是原始、未处理数据的入口,旨在利用 ClickHouse 的高性能与灵活性,满足高吞吐量数据摄取的需求。它既可以作为历史数据的存档,用于数据血缘追踪、调试或重新处理,也无需在这一阶段进行全面的清理和去重工作。通过聚焦于性能和灵活性,Bronze 层为后续的数据加工与转化提供了坚实的基础。

在 ClickHouse 中构建 Bronze 层的核心特性包括:

数据摄取

数据可以通过多种方式导入 Bronze 层,例如直接通过客户端、使用 Fivetran 等 ELT 工具,或通过 ClickPipes 和 ClickHouse Kafka 连接器消费 Kafka 流。在 ClickHouse Cloud 上,S3Queue 和 ClickPipes 提供了强大的能力,可以从 S3 存储桶中按需增量读取超过 70 种数据格式(包括压缩格式),如 Parquet 和 Iceberg 等湖格式。当处理大型半结构化数据时,使用 S3 作为暂存区是一种非常普遍的方式。

高效的快速插入

Bronze 层通常通过 MergeTree 表实现,其架构设计能够支持高效的快速插入操作。为了在需要将数据重放到 Silver 层或分析数据质量时提供良好的读取性能,我们会设计合理的表结构和排序键。由于 Bronze 层并不直接为最终消费者提供服务,建议将排序键优化为支持全数据扫描,例如按照时间顺序排序以提升读取效率。

处理半结构化 JSON 数据的新功能

ClickHouse 引入的 JSON 类型为 Bronze 层提供了强大的能力,可以轻松处理半结构化数据。该类型无需提前定义固定的模式,支持动态和不可预测的数据结构,非常适合处理模式不一致或频繁变化的数据集。通过支持动态 JSON,Bronze 层成为理想的原始数据存储区域,即使在模式不统一的情况下也能高效工作。此外,JSON 类型支持设置过滤规则,允许用户精准控制需要保留的对象路径。用户还可以选择在存储之前过滤无效 JSON 或展平复杂结构,为后续处理提供便利。

这种 JSON 类型不仅适用于 Bronze 层,还可以在其他层中使用。例如,它非常适合动态模式的列,例如用户标签。


Materialized 列:提升摄取效率的利器

Materialized 列为摄取阶段的字段提取和转换提供了一种高效的机制。尽管功能范围有限,但它可以为常用的查询属性创建派生列,从而显著提高 JSON 数据的处理效率。在处理路径或结构不规则的 JSON 数据时,这一功能尤为有用,可以完成基本的预处理,而无需严格执行完整的模式校验。此外,这些派生列还常被用于后续的条件过滤,进一步提升查询性能。

分区与数据保留策略

通过对 Bronze 层表进行分区,可以有效提升查询性能并简化数据管理。建议使用 TTL 规则定期清理旧数据,确保数据合规性的同时最大化存储资源的利用效率。


使用 ClickHouse 实现 Silver 层的优化  

Silver 层是 Medallion 架构中实现数据质量提升的关键阶段。在这个阶段,来自 Bronze 层的原始数据被清理、去重并统一为一致的结构,解决了无效行、模式不统一等问题。在 ClickHouse 的实践中,通常会将 Bronze 层表直接映射到 Silver 层表,同时对数据进行清洗和丰富,使其更适合用于 Gold 层的高级分析和展示。

动态增量物化视图

在 Silver 层,数据通常通过动态增量物化视图从 Bronze 层引入。这些视图会对新插入的 Bronze 层数据块执行过滤、转换和模式规范化处理,然后将结果写入 Silver 层表以实现持久化。通过这种方式,Silver 层实现了高效且连续的数据流转。用户还可以附加多个视图,为不同的 Silver 层表生成特定版本的数据,以满足多样化的下游需求。此外,无效或无法处理的数据行可通过独立的物化视图转入死信队列,便于检查和恢复,同时保持主数据集的干净和完整。

去重与变更数据捕获 (CDC)  

在需要去重或处理变更数据捕获 (CDC) 场景中,ReplacingMergeTree 表引擎是一种理想的选择。通过排序键,ReplacingMergeTree 可以实现去重操作,使用唯一值集合标识每行数据,同时通过版本化插入来处理更新——这一功能在 CDC 场景下尤为重要。需要注意的是,ReplacingMergeTree 的去重是在数据合并时完成的,因此其一致性是最终一致性。在查询时,可以使用 FINAL 操作符来确保结果中没有重复行,但需要权衡性能开销。为此,我们建议下游应用在读取数据时保持谨慎,以避免因 FINAL 操作符带来的查询性能影响。

分区与数据管理优化

和 Bronze 层一样,Silver 层表可以通过分区来优化查询性能和数据管理,并结合 TTL 规则清理不再需要的旧数据。此外,分区还可以提升从带 FINAL 的 ReplacingMergeTree 表读取数据时的性能。由于 Silver 层主要作为中间数据层,不是长期存储的场所,其数据保留时间通常可以比 Bronze 和 Gold 层更短,分区周期也可设置得更紧凑。


使用 ClickHouse 构建 Gold 层

Gold 层是 Medallion 架构的终点,在这里数据被精心策划为完全去规范化、业务就绪的数据集,为终端用户应用和分析提供服务。通过可刷新物化视图,Gold 层从 Silver 层接收数据,并执行复杂的转换,如连接和聚合操作,确保数据以最便捷的形式呈现,从而大幅减少查询时的额外操作需求。Gold 层的表设计注重性能优化,为下游应用提供最低延迟和最佳效率,确保能够快速响应业务需求。

支持定期更新的可刷新物化视图

Gold 层数据的填充依赖于可刷新物化视图,与 Silver 层使用的增量物化视图不同,这些视图通过定期查询 Silver 层表来完成数据的高级转换,例如复杂的连接操作。在将数据写入 Gold 层表之前,这些视图会先将数据去规范化。当从使用 ReplacingMergeTree 表的 Silver 层中获取数据时,这些视图还可以使用 FINAL 操作符确保完全去重,从而保证最高的数据质量,同时满足复杂查询需求的灵活性。

为下游应用优化的表设计

Gold 层的表通常基于标准 MergeTree 表构建,并针对下游应用的访问模式优化排序键。这些去规范化的数据集被设计为减少额外的连接操作,从而让应用程序能够快速、高效地读取数据。通过根据终端用户查询的特点优化表结构和排序键,Gold 层表能够无缝集成到各种报告工具、仪表板以及交互式用户界面中,确保卓越的用户体验。

增量物化视图加速聚合计算

除了存储去规范化的数据集外,Gold 层还常常使用增量物化视图来实现预计算聚合。这些视图在 Gold 层表中新插入的数据上执行 GROUP BY 查询,并利用 AggregatingMergeTree 引擎将中间聚合结果写入目标表。通过将计算从查询时转移到插入时,Gold 层显著降低了查询延迟。下游查询仅需合并少量的中间状态,大幅提升性能,非常适合支持具有复杂过滤和聚合需求的用户应用。

我们的示例应用 ClickPy 充分利用物化视图,对超过一万亿条 Python PYPI 数据记录提供高效的可视化和过滤功能。详情请查看相关文档【https://github.com/ClickHouse/clickpy】



ClickHouse 支持的完整 Medallion 架构

结合以上各个阶段,我们得到了完整的、基于 ClickHouse 实现的 Medallion 架构:

这一架构通过分层转换为数据管道提供了一种高效的管理方式。借助 ClickHouse 对超过 70 种文件格式的支持,原始数据可以直接通过 s3Queue 或 Clickpipe 功能 (适用于 ClickHouse Cloud) 导入到 Bronze 层。随后,这些数据会在 Silver 层中逐步得到清理和丰富,最终在 Gold 层被优化和策划,专为应用程序和分析需求服务。通过 ClickHouse 的 MergeTree 表、物化视图 (增量和可刷新) 以及对多种文件格式的支持,用户可以实现从数据摄取到转换再到交付的全流程,无需依赖任何外部工具。

值得注意的是,用户可以根据实际需求灵活选择是否使用架构中的所有层级。例如,如果数据质量较高且重复数据较少,可以直接跳过 Silver 层,从而简化管道流程。

尽管这种架构优势显著,能够为终端用户和应用程序交付高质量的优化数据,但它也面临一些挑战。

首先,Gold 层的表通常需要为每个消费场景优化数据结构,这可能导致数据的多次复制。然而,这种成本可以通过使用对象存储和分离存储与计算的方式有效降低。

其次,管理多个层级引入了额外的复杂性。对此,ClickHouse 提供了丰富的系统表功能,可以实时监控物化视图的状态和数据迁移过程。结合 Grafana 等工具,用户可以快速识别视图失败或数据不一致等问题,确保架构的可靠性。

但一个更难解决的挑战是,由于数据需要按顺序在各层之间移动,这一架构在实时性要求较高的场景中可能存在数据延迟问题。这使得在实时优化场景中部署这一架构更加复杂。


总结与展望 

基于 ClickHouse 的 Medallion 架构为管理数据工作流提供了一种强大且自成一体的解决方案。通过 ClickHouse 的原生功能,组织可以构建高效、可扩展的管道,交付清晰、优化的数据集,为分析和业务应用提供支持。

这一架构的独特之处在于其完全独立性。所有的数据摄取、转换和消费都在 ClickHouse 内完成,无需任何外部工具的介入。

在接下来的博客中,我们将展示如何基于 Bluesky 数据集构建一个实际的 Medallion 架构部署 (托管在 sql.clickhouse.com 上)。届时,您将能够亲身体验和查询架构的每一层。敬请期待!


/END/


注册ClickHouse中国社区大使,领取认证考试券

ClickHouse社区大使计划正式启动,首批过审贡献者享原厂认证考试券!


试用阿里云 ClickHouse企业版


轻松节省30%云资源成本?阿里云数据库ClickHouse 云原生架构全新升级,首次购买ClickHouse企业版计算和存储资源组合,首月消费不超过99.58元(包含最大16CCU+450G OSS用量)了解详情:https://t.aliyun.com/Kz5Z0q9G


征稿启示

面向社区长期正文,文章内容包括但不限于关于 ClickHouse 的技术研究、项目实践和创新做法等。建议行文风格干货输出&图文并茂。质量合格的文章将会发布在本公众号,优秀者也有机会推荐到 ClickHouse 官网。请将文章稿件的 WORD 版本发邮件至:Tracy.Wang@clickhouse.com


路过

雷人

握手

鲜花

鸡蛋

版权声明:本文为 clickhouse 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
返回顶部