The Linux Foundation Projects
Delta Lake

使用 Delta Lake 的结构化 Spark 流:综合指南

作者:Delta Lake

2024 年 3 月,Nike 的 Scott Haines 和自由数据工程师 Bartosz Konieczny 针对使用 Apache Spark 结构化流处理 Delta Lake 的流式传输做了一次精彩的演讲。本次网络研讨会展示了如何从数据发出到最终的 Delta 表目标,无缝地采用结构化流。

在这篇基于一个小时网络研讨会的博客文章中,您将学习如何利用 Apache Spark 结构化流处理 Delta Lake 表。这包括启用严格的模式强制执行、利用自动合并处理受信任的上游更改,以及了解何时采用防御性姿态以维护模式完整性。

您可以观看完整视频,并查看网络研讨会幻灯片

以下是他们演讲的摘要和高级概述。

第一部分:结构化流简介

在数据处理领域,将结构化流作为整个管道的核心组件至关重要。从最初的数据发出,到数据通过网络传输,最终到达 Delta 表目标,理解结构化流的细微差别可以显著增强您的数据工作流。

需要掌握的一个关键方面是 Delta 表中模式的重要性。这包括严格的模式强制执行、利用自动合并功能处理受信任的上游更改,以及了解何时采取严格的模式立场进行防御。

读者和写入器 API 揭秘

Apache Spark 流,特别是与 Delta 表结合使用时,提供了强大的功能,包括时间旅行功能。然而,初次接触结构化流的流式管道可能看起来令人望而生畏。

让我们将其分解为两个部分:一个面向初学者的概述和一个更深入的讨论。我们将从探索读者和写入器 API 的基础知识以及常见的客户目标开始。稍后,我们将深入探讨模式强制执行和演化等复杂主题,并对其进行简化以便更好地理解。

理解 Delta 表流

流式传输 Delta 表涉及两个主要组件:表本身以及使用结构化流 API 与其交互所涉及的步骤。它从初始化 Spark 源并获取最新快照以用于模式目的开始。然后,定义您的起点,无论是通过版本控制、时间戳还是默认为最新版本,都至关重要。

在确定微批次大小时,您有多种选项可用,例如根据字节数或最大文件数进行设置。然而,关键是要理解最大字节数选项是作为阈值而不是精确数字来运作的。此外,此速率限制选项的默认选择是 1000 个文件。

从传统的流式代理系统过渡到 Delta Lake 流式传输可能会揭示更新处理方式的差异。与基于变更日志的系统(如 Kafka)不同,Delta Lake 在不指定起始版本的情况下启动流式查询时,默认提供每行的最新版本。这样您就可以看到表的最新*快照*。

随着我们深入研究,我们会遇到模式验证和演化等复杂问题。添加性和非添加性模式在此处扮演着关键角色。如果您的模式不兼容,您的查询将无法启动。即使模式更改是添加性的,根据定义是向后兼容的演化,流式查询也会停止并要求您恢复它,以避免最终的模式更改传播。

检查点位置和文件可能会引入引用“reservoir”的命名约定,这源于 Delta Lake 的早期阶段,如今指的是 Delta 表。理解这些约定,以及起始版本和就地操作,对于有效的查询启动和处理至关重要。

写入和模式演化

转到写入方面,虽然与读取相比相对简单,但它涉及跟踪创建的数据文件并将其作为提交文件的一部分进行写入。当从单个数据帧写入多个 Delta 表时,幂等写入变得至关重要,即使在重试的情况下也能确保只写入一次。这个概念对于数据完整性和高效数据管道管理至关重要。

第二部分:模式演化和数据信任

从 Delta Lake API 的简单方面过渡到复杂方面,揭示了数据管理背后的复杂过程。然而,这些复杂性往往归结为人们的期望和限制。与利益相关者进行有效协作对于顺利的数据操作至关重要。

数据管道最终旨在支持数据产品,而建立信任对于可伸缩性至关重要。Delta Lake 提供多版本并发控制等功能,以确保平稳过渡并促进数据工程师之间的信任。

理解数据集所有权、更新频率和数据完整性机制对于建立信任至关重要。全面的表元数据,包括描述性信息和组织详细信息,增强了团队之间的理解和协作。

回填数据并考虑影响

由于模式更改而在流式表中回填数据时,没有一刀切的方法。这在很大程度上取决于具体的用例和要求。团队之间的沟通对于确保每个人都了解更改及其影响至关重要。

总之,掌握 Delta Lake 的结构化流需要深入理解读取器和写入器 API、模式演化和数据信任机制。通过采纳这些概念和最佳实践,组织可以简化数据工作流,确保数据可靠性,并促进团队间的协作。