Snowflake 流

2025年1月29日 | 阅读10分钟

引言

Snowflake Streams 是 Snowflake 提供的一项功能,Snowflake 是一个基于云的数据仓库平台,允许用户跟踪表数据更改。Snowflake Streams 捕获对表的插入、更新和删除,使用户能够创建高效可靠的变更数据捕获 (CDC) 流程。通过使用 Streams,用户可以执行增量数据加载、维护审计跟踪并确保不同系统之间的数据一致性。

什么是流?

Snowflake 中的流是一个数据库对象,用于记录对表所做的更改。它与表协同操作,捕获数据操纵语言 (DML) 操作,例如 INSERT、UPDATE 和 DELETE。流不存储实际的数据更改,而是存储有关更改的元数据。此元数据包括有关执行了何种操作以及哪些行受到影响的信息。

流的工作原理

创建流

要在 Snowflake 中创建流,请使用 CREATE STREAM 语句。

这里有一个例子

在此示例中,my_stream 是流的名称,my_table 是正在跟踪其更改的表。

流元数据

Snowflake 中的流存储有关更改的元数据。流中包含的关键列有

  • METADATA$ACTION: 指示 DML 操作的类型(INSERT、UPDATE、DELETE)。
  • METADATA$IS_UPDATE: 布尔标志,指示更改是否是更新的一部分。
  • METADATA$ROW_ID: 更改行的唯一标识符。
  • METADATA$PREVIOUS: 布尔标志,指示行是否代表数据的先前版本(用于更新)。

查询流

要检索流捕获的更改,请像查询表一样查询它。这是一个示例

此查询的结果将包含自上次查询流以来在我的表中已更改的所有行。查询流后,它会推进其偏移量,这意味着后续查询将只返回新的更改。

流的类型

Snowflake 提供两种主要类型的流来支持不同的数据捕获和处理需求:标准流和仅追加流。每种类型都有独特的用例,并且在捕获表数据更改方面操作不同。

Snowflake 支持两种类型的流

  • 标准流: 这些流根据定义的时间点捕获表中的更改。它们对于跟踪特定时间段内的更改和批处理很有用。
  • 仅追加流: 这些流仅捕获对表的插入,忽略更新和删除。它们专为主要关注新添加数据的场景而设计,例如事件日志记录或数据摄取任务。
Snowflake Streams

标准流

标准流根据定义的时间点捕获对表所做的所有类型的更改,包括插入、更新和删除。这种类型的流记录了一组全面的更改,使其适合跟踪特定时间段内的数据修改。

主要特点

  • 全面的变更跟踪: 捕获 INSERT、UPDATE 和 DELETE 操作。
  • 时间点快照: 更改是相对于流的偏移量捕获的,偏移量在每次查询时都会推进,确保后续只捕获新的更改。
  • 行版本: 维护更新前后的行版本,允许详细了解数据如何更改。

用例

  1. 批量处理
    • 示例: 零售公司每天运行批处理作业,以使用对事务表所做的更改来更新其数据仓库。标准流有助于捕获所有修改,确保数据仓库以最小的延迟保持最新。
    • 优点: 有效处理大量更改,减少扫描整个表以进行修改的需要。
  2. 数据复制
    • 示例: 组织需要将数据从生产数据库复制到报告数据库。使用标准流,他们可以捕获所有更改并将其应用于报告数据库,从而保持同步。
    • 优点: 确保一致的数据复制,捕获每个数据更改以进行准确报告。
  3. 审计跟踪
    • 示例: 出于合规性目的,金融机构要求对账户余额表的所有更改保留详细的审查记录。标准流捕获每个修改,为审计员提供清晰的记录。
    • 优点: 提供数据更改的详细日志,促进法规遵从性和数据完整性检查。

实现步骤

创建流

查询流

此查询返回自上次查询流以来对流所做的所有更改(INSERT、UPDATE、DELETE)的行。

  • 处理更改: 对捕获的更改应用必要的转换或业务逻辑。
  • 推进流偏移量: 每次查询流时,偏移量都会前进,这意味着在后续查询中只捕获新的更改。

仅追加流

仅追加流仅捕获对表的插入,忽略更新和删除。这种类型的流非常适合仅关注新添加数据的场景,例如事件日志记录或从仅追加源摄取数据。

主要特点

  • 仅跟踪插入: 仅捕获插入到表中的新行。
  • 简化的变更捕获: 忽略更新和删除,在仅新数据相关的场景中降低复杂性。
  • 高效数据摄取: 针对需要高吞吐量摄取新记录的用例进行了优化。

用例

事件日志记录

示例: Web 应用程序将用户活动(例如页面浏览量和点击量)记录到事件表中。仅追加流捕获这些日志,从而能够对用户行为进行实时分析。

  • 优点: 高效处理大量事件数据,专注于新条目,无需关注修改或删除。

数据摄取管道

示例: 公司将 IoT 设备的传感器数据摄取到 Snowflake 表中。由于数据是仅追加的,因此仅追加流捕获新的传感器读数以进行进一步处理。

  • 优点: 简化摄取管道,确保只处理新数据。

事务数据捕获

示例: 金融服务从 ATM 收集交易记录(例如存款和取款)。仅追加流在这些交易发生时捕获它们,并将它们馈送到下游处理系统。

  • 优点: 专注于捕获新交易,提高处理金融数据流的效率。

实现步骤

创建流

查询流

此查询返回自上次查询流以来仅反映新插入的行。

处理插入: 对新插入的行应用必要的转换或业务逻辑。

推进流偏移量: 每次查询流时,偏移量都会前进,这意味着在后续查询中只捕获新的插入。

标准流与仅追加流的比较

特性标准流仅追加流
捕获的更改类型INSERT、UPDATE、DELETE仅 INSERT
数据复杂性捕获更新和删除的完整行版本更简单,仅捕获新行
用例批处理、数据复制、审计事件日志记录、数据摄取
查询复杂性需要处理所有类型的 DML 更改仅关注插入
性能影响更高,因为有全面的变更跟踪更低,针对插入进行了优化
实施由于更改类型多样,更复杂简化,更改类型更少

  • Snowflake 流,无论是标准流还是仅追加流,都提供了强大的机制来实时捕获和处理数据更改。
  • 标准流为需要详细变更跟踪的场景提供了全面的解决方案,而仅追加流则为侧重于新数据摄取的用例提供了简化的方法。
  • 了解每种流类型的特定亮点和用例使组织能够实施高效有效的数据处理工作流,以满足其特定需求。

让我们深入详细解释所提供的每个元素

  • Kafka: Kafka 是一个分布式流平台,用于构建实时数据管道和流应用程序。它处理高吞吐量实时数据流的摄取。
  • 客户端 SDK: 客户端 SDK 是指允许客户端从 Kafka 生产和消费数据的软件开发工具包。它充当数据源和 Kafka 之间的中间层,实现无缝数据集成。
  • 行: 这表示正在摄取到 Kafka 中的原始数据。数据可能来自各种来源,例如事务数据库、应用程序日志或 IoT 设备。
  • 文件: 将数据摄取到 Kafka 后,需要将其移动到云存储服务以进行进一步处理。这些文件表示从 Kafka 导出的批处理数据。
  • S3、ABS/ADLS Gen2、GCS: 这些是存储从 Kafka 导出的文件的云存储服务。
    • S3: Amazon 简单存储服务
    • ABS/ADLS Gen2: Azure Blob 存储/Azure Data Lake 存储 Gen2
    • GCS: Google Cloud Storage

Snowpipe(带自动摄取): Snowpipe 是 Snowflake 用于持续数据摄取的服务。它会自动将云存储中的文件数据加载到 Snowflake 表中。自动摄取功能确保一旦存储中有新文件可用,Snowpipe 就会获取它们并将其加载到 Snowflake 中的临时表中。

  1. 临时表: 这是 Snowflake 中的一个中间表,原始文件数据最初加载到其中。临时表在数据进行任何转换之前充当临时存储区域。
  2. 转换: 此步骤涉及将临时表中的原始数据转换为精炼格式。转换可能包括数据清理、丰富、聚合以及准备数据进行分析所需的任何业务特定逻辑。
  3. 精炼表: 这些是 Snowflake 中包含已处理和已转换数据的最终表。它们经过优化,可用于查询和分析,并提供干净、结构化且随时可用的数据。

流程说明

  • 数据摄取到 Kafka: 数据通过各种生产者使用客户端 SDK 摄取到 Kafka 中。这些生产者可以是生成数据流的应用程序、服务或设备。
  • 从 Kafka 导出数据: Kafka Sink Connector 用于将摄取的数据从 Kafka 导出到基于文件的格式。然后将导出的文件存储在 S3、ABS/ADLS Gen2 或 GCS 等云存储服务中。
  • 云存储中的数据存储: 导出的文件放置在指定的云存储桶中。此桶充当 Kafka 和 Snowflake 之间的中间存储位置。
  • 使用 Snowpipe 持续加载数据: 配置有自动摄取功能的 Snowpipe 持续监控云存储桶中的新文件。当检测到新的数据文件时,Snowpipe 会自动将数据摄取到 Snowflake 中的临时表中。
  • 将初始数据加载到临时表: 文件中的原始数据加载到 Snowflake 中的临时表中。此表临时保存未处理的数据。
  • 数据转换: 对临时表中的数据应用转换过程。这些转换可能包括过滤、聚合、与其他数据集联接或任何其他所需的数据操纵任务。
  • 将数据加载到精炼表: 转换后的数据加载到精炼表中。这些表结构化并优化用于分析查询,使数据分析师和业务用户更容易提取见解。

好处

  • 适应性: 凭借 Kafka 的分布式特性和 Snowflake 的可扩展性,该设计可以处理大量信息摄取和处理。
  • 实时处理: Snowpipe 的自动摄取功能确保数据持续加载到 Snowflake 中,从而实现近实时分析。
  • 无缝集成: 客户端 SDK 和 Kafka 连接器的使用允许与各种数据源和目标无缝集成。
  • 灵活性: 该架构支持多种云存储选项,允许用户选择最适合其组织需求的存储服务。
  • 效率: 通过在 Snowflake 中使用临时表和转换,数据处理工作流得到简化,减少了延迟并提高了效率。

使用流的最佳实践

优化查询性能

查询流时,请确保您的查询经过优化,以有效地处理大量更改。利用适当的索引、分区和查询过滤器来减少处理的数据量。

管理流偏移量

定期查询和处理流以避免累积大量更改。这有助于保持性能并确保及时的数据处理。

监控和警报

为您的流设置监控和警报以检测异常或性能问题。监控流的健康状况对于确保它们按预期运行至关重要。

将流与任务结合使用

利用 Snowflake 任务来自动化流处理,确保流捕获的更改在无需手动干预的情况下得到处理和应用。

实现错误处理

在流处理工作流中纳入强大的错误处理机制。这包括重试逻辑、日志记录和警报,以管理数据处理过程中出现的任何问题。

高级功能和注意事项

处理更新和删除

流不仅跟踪新行,还跟踪更新和删除。这对于维护准确一致的数据状态特别有用。当一行被更新时,流会捕获该行的旧版本和新版本,让您可以查看完整的更改历史记录。

管理流偏移量

流在每次查询时都会推进其偏移量。这意味着在查询流之后,它只保留在该查询之后发生的更改。要处理您需要重复处理同一组更改的场景,请考虑创建临时表或视图来存储流查询的结果。

流保留期

流中数据的保留期取决于表的 Time Travel 功能,该功能允许您在指定的时间段内访问历史数据。默认情况下,此期间为一天,但可以延长至 90 天。此保留期会影响更改在流中可用的时间。

性能考虑

虽然流提供了强大的变更数据捕获机制,但必须考虑它们对性能的影响。大量的更改或频繁查询流会影响系统资源。监控和优化流的性能至关重要,尤其是在高速环境中。

总结

Snowflake Streams 提供了一种强大灵活的变更数据捕获机制,支持各种用例,例如增量数据加载、数据复制、审计和实时分析。

  • 通过了解如何创建、查询和管理流,用户可以在 Snowflake 中构建高效可靠的数据工作流。
  • 实施最佳实践和监控性能是最大限度地发挥流的优势同时确保数据完整性和系统效率的关键。
  • 无论您是希望简化数据摄取过程、维护同步数据集还是构建实时分析管道,Snowflake Streams 都提供满足您需求的工具和功能。
  • 拥抱 Snowflake Streams 的强大功能,在现代云数据仓库环境中释放数据的全部潜力。