1. 课程导入与全景认知

在开始动手写第一条管道之前,我们需要先建立一张"地图"。Snowflake 的数据工程能力并不是单一功能,而是由存储、计算、数据加载、流式捕获、任务调度、通知与外部集成等多个部件协同构成的体系。如果一开始就扎进某个具体语法,很容易出现"会写 SQL 但不知道放在哪一层、什么时候触发、失败后谁来兜底"的问题。本节的目标是让你先看清整体轮廓:哪些能力属于批处理、哪些属于流式、任务编排在中间扮演什么角色,以及一个典型场景从数据落地到结果可用会经过哪些环节。

一、学习目标与能力边界

完成本课程后,你应当能够独立完成以下四类工作:

  • 批处理管道构建:使用 COPY INTO、外部表、Snowpipe 将对象存储或本地文件持续加载进 Snowflake 表,并处理去重、错误行与加载历史。
  • 流式与增量捕获:使用 Stream(流)对象捕获表的 CDC(变更数据捕获)记录,配合 Task(任务)实现分钟级增量处理,而不是每次全量重算。
  • 任务编排:用 Task DAG 组织有依赖关系的 SQL、存储过程与 Snowpark 逻辑,设置调度频率、前置条件(WHEN)、错误通知与重试策略。
  • 可观测与运维:通过 INFORMATION_SCHEMA、ACCOUNT_USAGE 视图与通知集成,判断任务是否按预期运行、数据是否新鲜、失败如何定位。

需要明确的边界是:Snowflake 负责"数据到达之后的加工与调度",它不负责源端业务系统的变更捕获机制本身(如 MySQL binlog 解析通常由 Kafka Connect、Debezium 等外部工具完成),也不替代通用工作流引擎(如 Airflow)做跨系统的复杂编排。理解这条边界,能避免把不该由 Snowflake 承担的责任硬塞进 Task 里。

二、核心概念:批、流、任务三者的关系

批处理与流处理在 Snowflake 中并不是两套割裂的系统,而是共享同一份存储与计算资源,区别主要在触发方式与数据粒度:

  • 批(Batch):按固定周期或手动触发,一次处理一批文件或一段区间的数据,典型工具是 COPY INTO 与 Snowpipe 的批量加载模式。
  • 流(Stream):不是数据副本,而是对表变更的"偏移量记录"。它记录 INSERT、UPDATE、DELETE 的元数据,消费后偏移量前移,因此天然支持增量。
  • 任务(Task):调度的执行单元,可以按 cron 表达式或 AFTER 依赖关系触发,内部执行 SQL、调用存储过程或运行 Snowpark Python。

三者组合出的典型模式是:外部数据先经 Snowpipe 或 COPY INTO 落入原始表(Raw),原始表上建立 Stream 捕获增量,Task 按分钟或小时消费 Stream 并写入清洗层(Silver),再由下游 Task 聚合到应用层(Gold)。这条链路就是本课程反复出现的"批流一体"骨架。

三、整体架构与数据流

下图给出一个典型场景的端到端结构:左侧是数据来源与加载通道,中间是 Snowflake 内部的存储分层与流/任务编排,右侧是消费与监控出口。请注意箭头方向表示数据流动方向,虚线表示控制或元数据关系。

Snowflake 批流数据管道与任务编排全景 数据来源 对象存储 S3 / OSS Kafka / CDC 消息 业务库增量导出 加载通道 Snowpipe 自动摄取 COPY INTO 批量加载 外部表 / 直查 Snowflake 内部 Raw 原始层 落地表 · 保留原始字段 · 追加写入 Stream 变更捕获 INSERT / UPDATE / DELETE 偏移量 Silver 清洗层 去重 · 类型转换 · 增量合并 MERGE Gold 应用层 聚合指标 · 宽表 · 供 BI 查询 Task DAG 编排 · 调度 · 依赖 · 重试 消费与监控 BI / 报表查询 通知集成 ACCOUNT_USAGE 数据流 控制 / 元数据关系 存储分层 加载与清洗 消费与监控 箭头方向表示数据流动方向;虚线表示调度、依赖或监控等控制关系

四、典型应用场景

这套架构在以下几类场景中价值最明显:

  • 近实时报表:业务库变更经 CDC 进入对象存储,Snowpipe 自动加载,Stream + Task 每分钟合并到 Silver,BI 查询延迟可控制在数分钟内。
  • 日志与事件分析:应用日志按小时批量写入,Task 定时聚合出错误率、响应时间分位数等指标,供运维看板使用。
  • 多源数据整合:不同来源的订单、库存、用户数据分别加载到 Raw,再由 Task DAG 按依赖顺序清洗、关联、生成统一宽表。
  • 数据回填与重跑:历史数据一次性 COPY INTO,再通过带参数的 Task 或存储过程按日期分区重算,避免全量刷新。

五、一个可参考的起步参数示例

为了让后面的章节有具体对象可操作,这里给出一个示例配置(属于教学假设,非实测结果):原始表 RAW_ORDERS 按天分区,Snowpipe 使用 AUTO_INGEST = TRUE;Stream 命名为 STRM_ORDERS;清洗 Task 调度频率设为 1 MINUTE,并设置 WHEN SYSTEM$STREAM_HAS_DATA('STRM_ORDERS') 作为前置条件,避免空跑消耗计算资源;错误通知通过 ERROR_INTEGRATION 发送到消息队列。这些参数在后续章节会逐一展开,此处只需记住它们各自属于哪一层。

学习建议:每学完一个部件,回到本节的架构图,标出它落在哪个位置、上游是谁、下游是谁。当你能不看图说出"Stream 在 Raw 和 Silver 之间,由 Task 驱动消费",说明你已经建立了正确的整体认知。

接下来,我们将从最基础的加载通道开始,逐步把这张全景图上的每个方框变成可以运行的真实对象。