The Linux Foundation Projects
Delta Lake

使用 Delta Lake 构建勋章架构

作者:Matthew Powers

本文将解释如何使用 Delta Lake 表构建具有勋章架构的 ETL 管道。

勋章架构将数据流组织成三个阶段的数据表:

  • 青铜层:原始摄取数据
  • 白银层:清洗/联接的数据集
  • 黄金层:业务级别的聚合数据

勋章架构是解决许多业务用例(例如 BI、报告、AI 和 ML)的绝佳框架。本文将解释何时利用勋章架构及其灵活的特性。

Delta Lake 是一种出色的开放式表格式,适用于使用勋章架构构建管道,因为它支持可靠的事务、适用于小型和大型数据集,并且具有许多内置功能,可以加快处理时间。

让我们看看如何构建一个像这样的勋章架构:

勋章架构示例

假设您正在为一家电子商务公司的会计部门构建一个 BI 界面。该部门希望跟踪特定产品在不同时间段内的总销售额和收入。

该公司平均每分钟摄取 1 GB 的交易数据。交易量全天都在变化:在美国时区人们睡觉时较低,而在网络星期一等特殊销售期间则高得多。由于数据摄取量不稳定,扩展计算并以“适当大小”的文件存储数据具有挑战性。

团队希望仪表板能快速加载。仪表板应每小时更新一次数据,但计算不必完全精确(仪表板上允许少量误差,以缩短仪表板加载时间)。

团队决定按如下方式构建管道:

  • 使用 Kafka 和 Flink 将交易数据摄取到青铜 Delta 表中。
  • 使用 Spark 联接数据集、清洗数据并创建白银 Delta 表。在白银层,交易被去重,原始交易与客户表联接。
  • 使用 Spark 计算具有客户级别聚合的 HyperLogLog (HLL) 草图,并将其持久化到黄金 Delta 表中。HLL 草图是实现低延迟查询和近似结果的好方法。仪表板工具可以根据这些黄金表快速计算各种客户洞察。
  • 使用 BI 工具查询黄金 Delta 表来构建仪表板。这将为企业提供客户行为的最新洞察,并允许其轻松查询不同时间段的数据。

这是该架构的视觉表示:

勋章架构是构建此数据管道并增加业务价值的绝佳概念框架。

让我们看看一些对这个勋章架构管道有用的 Delta Lake 功能。

有助于勋章架构的 Delta 功能

Delta Lake 具有许多功能,可以帮助这个基于勋章架构的管道高效运行。

可靠事务

Delta Lake 支持具有 ACID 特性的可靠事务。

数据湖不支持事务,可靠性较低。它们缺乏一致性(内置模式强制执行/列约束)、原子性(事务要么完全完成,要么完全失败)和隔离性(保证顺序事务)。

使用数据湖的数据摄取管道很容易损坏,因为它们不支持可靠的事务。

小文件压缩

此数据摄取管道每分钟将数据从 Kafka 写入 Delta 表,这会创建许多小文件。数据引擎最适合“适当大小的文件”——文件太小会导致过多的 I/O 开销,文件太大则不利于文件跳过优化。

变更数据流 (Change Data Feed)

启用变更数据流允许下游系统执行高效的增量更新。例如,您可以在白银表上启用 CDF,并使用它智能地增加黄金表中的业务聚合数据,而无需在每次管道运行时进行完全刷新。

增量更新比完全刷新快得多,并且更具成本效益。

删除向量

删除向量允许使用 Delta Lake 比使用数据湖更快地运行删除、更新和合并操作(“DML 操作”)。

勋章架构可以受益于快速 DML 操作。例如,您可能希望将数据摄取到青铜表中,然后清洗一些混乱的记录并删除重复的行。这种 ELT 设计模式在 Delta Lake 中是可行的,而在数据湖中则不行。

液态聚类

Delta Lake 提供液态聚类,将相似的数据并置在相同的文件中,以便下游查询可以运行得更快。Hive 风格分区和 Z-ordering 是其他分组相似数据的方法,但它们有缺点。

液态聚类非常适合此示例中的黄金表,因此 BI 工具可以提供低延迟的最终用户体验。

多引擎支持

Delta Lake 支持 Spark 和许多其他引擎。当您使用 Delta Lake 构建勋章架构管道时,您可以灵活地为管道的每个阶段选择最佳引擎。这至关重要,尤其是在不同管道阶段的数据大小和查询延迟需求差异很大时。

还有更多…

Delta Lake 还有许多其他功能,可用于构建健壮的 ETL 管道。我们无法在此列出所有功能,但请查看其他 Delta Lake 关键功能以了解更多信息。

带有 Unity Catalog 的勋章架构

Unity Catalog 具有三级命名空间,可用于组织您的勋章架构表。让我们看看 Unity Catalog 命名空间如何组织我们示例应用程序中的数据。

以下是 Unity Catalog 命名表的方式:catalog_name.schema_name.table_name。

让我们看看组织如何为勋章架构命名表:

something_cool
  bronze
    raw_transactions
    table_b
  silver
    user_transactions
    table_b
  gold
    user_transactions
    users

当您看到 something_cool.bronze.raw_transactions 时,您可以轻松识别该表包含原始摄取数据。

something_cool.gold.user_transactions 清楚地表明该表包含业务级别聚合数据。

Unity Catalog 提供了一种方便的方式来命名勋章架构中的表。

何时偏离勋章架构

勋章架构只是“分层”架构的一个名称。将数据流分阶段考虑,您可以根据需要任意组合这些阶段。

采用勋章架构的组织应以灵活的方式遵循它。

例如,您可以通过联接青铜表和白银表来构建黄金表。构建黄金表时,不必只使用白银表。

还应考虑其他构建数据平台的方式,例如维度数据建模。要构建最佳数据架构,您需要考虑查询模式、数据分布和最终用户需求。

正如 Simon 在这段出色的视频中提到的,您不必使用勋章模型构建数据架构,也不必使用“勋章命名法”,例如青铜、白银和黄金。

使用最适合您业务的架构。

团队环境中的勋章架构

勋章架构也非常适合组织中许多团队之间的协作。例如,数据工程团队可能负责摄取数据并构建青铜、白银和黄金表。

数据科学家可能只需使用 PyTorch 和 Ray 等引擎消费黄金表来执行高级分析。

数据分析师也可能只需查询黄金表来生成报告。他们可能只查询表,而不需要创建任何表。

通过勋章架构正确抽象表,您可以更好地应用 Unity Catalog 等工具进行数据治理。

结论

勋章架构是构建 ETL 管道、跨团队分离工作以及解决 BI、报告和高级分析等业务问题的良好概念框架。

最好将其视为一个可选的、灵活的框架。请随意根据您的业务需求进行调整,或者如果更合理,则完全选择另一种架构。

Delta Lake 是一种出色的开放式表格式,适用于构建勋章架构,因为它支持可靠的事务,可与多种引擎互操作,并且具有对 ETL 管道每个阶段都有用的功能。

LinkedIn 上关注我们的作者