跳至主要内容

Snowflake 数据摄取:全面指南

通过本指南了解在 Snowflake 中进行数据摄取。无论您是新手还是想快速回顾其功能,本教程都非常适合。
· 12分钟 阅读

使用 AI 探索

Snowflake 是一款云原生数据平台,因其可扩展性、性能和简洁性而被数据从业者广泛采用,适用于从分析到数据科学的各种场景。不过,要充分发挥其优势,掌握 Snowflake 的数据摄取至关重要。如果您刚接触该平台,建议先从这篇Snowflake 初学者教程入手,先熟悉其架构。

高效且设计合理的数据摄取管道,对于确保下游使用场景中的数据可用且可靠至关重要。无论是定期的批量更新,还是实时数据流,选择合适的摄取方法和工具都会直接影响数据管道的性能与可维护性。

在深入细节之前,先了解一些关于数据流的关键概念:

  • 批量摄取 vs 实时摄取:批处理按计划的时间间隔加载数据,一次性导入大块数据。实时摄取则在数据生成时几乎实时可用,呈现为实时流。您可以通过这篇关于批处理与流处理的文章了解更多。
  • 结构化数据 vs 半结构化数据:结构化数据能整齐地落在行与列中;而半结构化数据(如 JSON 或 Avro)需要更灵活的处理方式,并使用标签或标记辅助摄取。

什么是 Snowflake 中的数据摄取?

数据摄取是指将来自各种来源的数据搬入数据库以进行存储、处理和分析的过程。无论您的数据来自云存储、数据库、应用程序还是事件流,摄取都是 Snowflake 数据生命周期中的第一步。

Snowflake 的独特架构将计算与存储分离,使得在不影响分析性能的前提下简化了数据摄取过程。根据数据来源和用例,摄取可以面向内部阶段(Snowflake 内部)或外部阶段(如 S3 或 Azure Blob Storage)。如需更多洞见,请参阅这篇深入介绍Snowflake 架构的文章。

关键的摄取考量

在设计摄取管道时,请牢记 数据的四个 V:

  • Volume(体量):您要摄取多少数据?
  • Velocity(速度):数据到达的频率如何?
  • Variety(多样性):涉及哪些格式(CSV、JSON、Parquet)?
  • Veracity(准确性):数据的可信度如何?需要怎样的清洗水平?

这四个方面都很重要。体量与速度要求我们考虑管道的带宽及其处理能力;多样性与准确性则要求我们构建健壮且灵活的管道,能够在数据流动过程中进行质量检查。

关键摄取考量

Snowflake 中的数据摄取方法

下面介绍在 Snowflake 中可用的一些数据摄取方法。部分方法涉及使用 COPY INTO 命令、Snowpipe 或 Snowpipe Streaming。

使用 COPY INTO 的批量摄取

Snowflake 最基础的摄取方式是 COPY INTO 命令。COPY INTO 会将存放在外部阶段的文件加载到 Snowflake 表中,非常适合批量加载历史数据或定期的批处理更新。

从云存储加载数据

您可以通过创建一个连接云服务与 Snowflake 的外部阶段,从 Amazon S3、Azure Blob Storage 或 Google Cloud Storage 加载数据。配置好文件路径和凭据后,Snowflake 会高效读取并处理文件。

处理不同的数据格式

COPY INTO 支持多种格式:CSV、JSON、Avro、ORC 和 Parquet。创建连接器时可以配置多种格式化选项。列表相当全面,常见设置包括日期格式、分隔符(逗号或其他)、编码、空值选项等。强烈建议阅读 Snowflake 官网的文档以获取完整细节。

错误处理与监控

您可以配置 ON_ERROR 设置以跳过有问题的行、终止加载或记录错误。结合 VALIDATION_MODE 可追踪并返回错误。还可以使用如 LOAD_HISTORY 这类元数据表来跟踪加载过程中出现的错误数量。

使用 Snowpipe 的持续摄取

Snowpipe 通过自动检测并加载指定阶段中新出现的文件,实现持续摄取。该功能内建于 Snowflake 平台,提供自动文件集成、基于事件的触发与监控能力。

自动化文件摄取

Snowpipe 可通过与云存储通知集成来配置自动摄取,减少手动执行需求。比如,Amazon S3 提供事件通知,能在特定存储桶发生变更时提醒用户。

Snowpipe 可以关联到一个能够接收这些通知的用户。当该用户收到事件通知时,会触发 Snowpipe 开始数据摄取流程。

pipeline showing data files flowing into Snowflake external S3 stage with ingestion SQS queue leading to the triggering of the Snowpipe COPY INTO function

自动化数据摄取示意图(Snowflake 文档)

监控与管理

Snowflake 提供多种监控与错误管理工具。元数据表 PIPE_USAGE_HISTORY 允许用户查看数据加载历史,如已摄取的字节数与文件数。表 VALIDATE_PIPE_LOAD 会提供错误相关信息。

在 Snowpipe 中,还有 ON_ERROR 设置,可用于跳过文件并发送错误告警通知。

使用 Snowpipe Streaming 的实时流式摄取

Snowpipe Streaming 是 Snowflake 最新的实时流数据摄取方法,具备亚秒级时延。不同于基于文件触发的 Snowpipe,Snowpipe Streaming 通过 API 逐行摄入数据。两者相辅相成,既灵活又高效。

使用 Snowflake Ingest SDK

Snowflake Ingest SDK 允许开发者编写 Java 或 Scala 应用,通过内存驻留队列将数据直接推送到 Snowflake。这些应用可从 Apache Kafka 主题等流式连接器接收行级数据。

使用场景与优势

对于遥测、点击流或物联网数据,Snowpipe Streaming 能以最小的存储开销和高吞吐确保近实时的数据可用性。当您需要高速、近实时的数据时,这种摄取方式尤其适合。

Snowflake 数据摄取相关工具

在使用 Snowpipe 和 Snowpipe Streaming 将数据摄取到 Snowflake 的过程中,需要一些工具来正确连接数据管道。一个重要的工具是 Kafka,它常用作数据源与 Snowflake 之间的通信桥梁。或者,您也可以使用 Fivetran、Matillion 等第三方工具来管理将数据抽取、转换并加载(ETL)到 Snowflake。

面向 Kafka 的 Snowflake 连接器

Snowflake 提供 Kafka 连接器,可从 Kafka 主题读取并将消息直接写入 Snowflake 存储。数据发布到 Kafka 后,借助 Snowpipe 或 Snowpipe Streaming,Snowflake 能获取这些已发布数据并将其传入内部存储。这是极其灵活的数据传输方式。我推荐这门Apache Kafka 入门课程,介绍了 Kafka 的强大与可扩展性。

Kafka 配置与最佳实践

您需要配置 Kafka Connect worker,并设置主题名称、缓冲区大小、Snowflake 凭据等参数,以正确完成集成。

这些配置还允许我们设定需跟踪的数据类型与元数据信息。定义这些连接的两种主要方式是通过 Confluent(第三方托管版 Apache Kafka)或使用开源的 Apache Kafka JDK 手动配置。

无论选择哪种方式,请遵循以下最佳实践:

  • 使用分区与基于键的排序来保持事件顺序。
  • 优化刷新间隔,以平衡时延与吞吐。

使用 Kafka 搭配 Snowflake SDK 进行流式数据传输的示例(Snowflake 文档)

第三方 ETL 工具

除 Kafka 外,Fivetran、Matillion、Talend 等第三方 ETL 平台也提供托管的 ETL/ELT 方案,可将数百个来源的数据摄取并转换后导入 Snowflake。这类平台通常提供低代码、简化的 SaaS 数据管理方案,但选择这些平台也有其不足之处。

第三方 ETL 工具的优缺点

使用第三方 ETL 工具时,需要重点考虑成本与灵活性。虽然它们确实简化了将数据摄入 Snowflake 的过程,但某些限制最终可能会增加使用难度。

  • 优点:零代码配置、支持常见 SaaS 工具的连接器、内置转换功能、集成简便
  • 缺点:订阅费用高、对自定义逻辑的控制有限、且往往受制于厂商,难以迁出

在了解这些约束后,选择合适工具时应考虑:

  • 团队的技术能力
  • 频率与时延要求
  • 对源系统的支持情况
  • 预算与许可限制

Snowflake 数据摄取的最佳实践

构建管道并不轻松,但有一些通用理念与最佳实践可帮助您事半功倍,旨在提升效率并降低成本。

为性能与成本进行优化

通过使用 gzip 或 Parquet 等文件格式,尽量减小文件体积以降低存储成本。此外,在数据传输时,复制过程中通常应优先选择更少但更大的文件,而非大量小文件。单个大文件的网络开销往往低于多次传输小文件。最后,如果计算与网络成本是顾虑,请将大型批处理作业安排在非高峰时段。

同时,务必在管道中处理模式演进。一些数据类型(如 Parquet)天然支持模式演进。这意味着即使数据源的模式发生变化,也不会影响历史数据,并能保持前向/后向兼容。

确保数据质量与可观测性

在数据摄取管道中,还需确保数据质量与可观测性。一个明智做法是在将数据整合到最终数据库存储前,先进行分层(staging)。您可以校验哈希与元数据以确保数据准确无误、未被破坏。此外,与其让用户直接访问底层数据,不如构建视图来整合不同数据源,从而提供更佳的使用体验。

最后,请持续监控并记录数据管道的健康状况。使用 Snowflake 的元数据视图或 DataDog、Monte Carlo 等外部可观测性工具搭建仪表板,跟踪摄取成功率、时延与失败情况。

动手实践:将数据摄取到 Snowflake

这里我们将介绍在 Snowflake 中构建管道的一些高层示例。请注意,具体步骤可能因数据管理员对您 Snowflake 环境的配置而异。务必遵循您所在组织的最佳实践!

先决条件

首先,一些先决条件。您需要拥有可管理数据库的 Snowflake 账号。常见的访问权限包括创建 schema 的能力。其次,请确保您所在的服务器可以访问用于存放数据的外部云存储桶或内部存储。与您的数据库管理员沟通确认。

步骤 1:使用 COPY INTO 加载数据

下面通过一个简单示例,演示如何将 CSV 文件加载到您的 Snowflake 数据库。

1. 准备并上传数据 按需格式化文件(如 CSV),并上传到云存储桶。

2. 创建阶段与文件格式

/* specify the file format */CREATE FILE FORMAT my_csv_format TYPE = 'CSV' 

/* this will help if there are double quotes or apostrophes in your data */

FIELD_OPTIONALLY_ENCLOSED_BY='"';

/* Stage the data using the credentials you have */

CREATE STAGE my_stage URL='s3://my-bucket/data/' CREDENTIALS=(AWS_KEY_ID='...' AWS_SECRET_KEY='...');

3. 运行 COPY INTO 并验证

COPY INTO my_table FROM @my_stage FILE_FORMAT = (FORMAT_NAME = 'my_csv_format');SELECT * FROM my_table;

步骤 2:使用 Snowpipe 实现自动化摄取

使用 Snowpipe 创建自动化摄取其实相当简单!

1. 创建 Snowpipe

CREATE PIPE my_pipe 

AUTO_INGEST = TRUE

   AWS_SNS_TOPIC = 'arn:aws:sns:us-west-2:001234567890:s3_mybucket'

	AS 

COPY INTO my_table 

FROM @my_stage

 FILE_FORMAT = (TYPE = ‘CSV’);

2. 配置云存储事件 使用 SNS/SQS 为 S3 存储桶设置通知以触发 pipe。更多细节可参考这篇 Datacamp 的 AWS SNS 指南。

3. 监控摄取 

务必查询元数据表 SNOWPIPE_EXECUTION_HISTORY 以查看 pipe 活动。

步骤 3:使用 Snowpipe Streaming 进行流式数据传输

配置 Snowpipe Streaming 的过程相对复杂,超出本文详细范围。这里介绍一些基本步骤,更多示例建议阅读Snowflake Streaming 文档,了解如何构建客户端 SDK。

  1. 设置 SDK:在您的 Java 或 Scala 应用中安装 Snowflake Ingest SDK。随后在 profile.json 文件中配置 API 连接设置。所需属性包括授权凭据、Snowflake 的 URL 和用户信息。这样 SDK 才能连接到您的 Snowflake 服务器。编写其余 Java 代码以处理传入数据,包括 insertRows 方法。
  2. 使用示例应用进行数据流式传输:通过 ClientSDK 从 Kafka 连接器将数据推送到您的 Snowflake API。
  3. 监控并处理错误:捕获 SDK 异常,重试失败请求,并使用元数据表与仪表板监控摄取指标。确保您的 API 具备防错与错误通知能力。

结论

Snowflake 提供了强大而灵活的数据摄取方案——从传统批量加载到实时流式传输。通过了解可用的工具与技术,数据团队可以设计出可靠、高性能且具成本效益的管道。无论您刚刚起步,还是在优化企业级方案,掌握 Snowflake 数据摄取都是构建现代数据栈的关键一步。如果您想进一步了解 Snowflake,强烈推荐以下资源:

Snowflake 数据摄取常见问题

Snowpipe 与 Snowpipe Streaming 有何区别?

Snowpipe 通过基于事件的触发,在文件(通常存放于云存储)落地后进行摄取。Snowpipe Streaming 则通过 SDK 从应用直接实时逐行摄取,实现亚秒级时延。

Snowflake 能否自动检测传入数据的模式变更?

并非自动。您需要手动实施模式演进策略,或使用支持该能力的工具。对于 JSON 等半结构化数据,可以使用 variant 列来容纳动态结构。

如何监控我的数据摄取是否正常运行?

Snowflake 提供多种视图,如 LOAD_HISTORY、PIPE_USAGE_HISTORY 和 TASK_HISTORY,用于跟踪摄取事件、错误与性能。您也可集成可观测性工具以获取告警与仪表板。

Snowflake 支持哪些文件格式进行摄取?

Snowflake 支持 CSV、JSON、Avro、ORC、Parquet 和 XML。您可通过文件格式对象定义文件的解析方式。

除了云存储或 Kafka,我还能从其他来源将数据摄取到 Snowflake 吗?

可以。您可以使用第三方工具(如 Fivetran、Matillion、Airbyte)、Snowflake 的 REST API、Snowpipe Streaming,或借助连接器或 SDK 的自定义脚本来摄取数据。

主题