构建数据摄取管道 是做什么的?
何时使用
- 从数据库、API、文件或 SaaS 中提取数据到数据仓库/数据湖。
- 设计增量提取、水印或 CDC。
- 处理 API 分页、速率限制和重试。
- 决定使用托管式 EL(Fivetran/Airbyte)还是自定义代码。
- 不要用于转换已落地数据(应使用 dbt/Spark 技能)。
工作流
- [ ] 决定提取模式:全量快照 vs 增量 vs CDC
- [ ] 选择可靠的高水位标记(updated_at、LSN/binlog、序列)
- [ ] 原始数据不可变落地(追加),下游进行转换
- [ ] 使负载幂等(按键 upsert / 按分区覆盖)
- [ ] 处理分页、速率限制、重试和迟到数据
- 选择模式。 全量重载(小型/维度表)、基于某个高水位标记的增量(大多数事实表)或 CDC(高吞吐 OLTP,需要捕获删除及每次变更)。
- 选择可信的水印。
updated_at仅在源始终更新它时才可用;否则使用数据库日志位置(LSN/binlog/SCN)或单调递增序列。存储上一次水印并从中恢复。 - 原始数据不可变落地。 将原始提取数据追加存储(青铜层)并带上加载元数据;下游进行转换,以便无需重新拉取源即可重放。
- 幂等负载。 按自然键 upsert 或覆盖分区,使重试和重叠不会导致重复(参见
writing-idempotent-transformations)。 - 健壮性处理 分页、速率限制和迟到数据。
模式
带重叠窗口的增量提取(处理迟到数据):
-- 在上一次水印后拉取一个小的重叠窗口,以捕获迟到更新,
-- 然后按键 upsert,使重叠不会产生重复。
SELECT * FROM source.orders
WHERE updated_at >= :last_watermark - INTERVAL '3 days';
CDC — 读取数据库日志(Debezium/原生方式)捕获插入、更新和删除(基于水印的提取无法捕获删除)。使用 MERGE 应用变更,利用变更的提交位置进行排序。
API 分页 + 速率限制 — 跟踪游标/下一页令牌;遇到 429/5xx 时使用指数退避和抖动进行回退和重试;记录进度,使失败时能从中断处继续。
托管式 vs 自定义 — 对标准连接器使用 Fivetran/Airbyte(它们处理模式漂移、增量状态、重试等);仅在非标准源或因严格管控/成本需求时编写自定义代码。
常见陷阱
updated_at水印但源未可靠设置它 — 静默丢失行;验证或切换到基于日志的 CDC。- 没有重叠窗口 — 迟到到达的更新在多次运行之间丢失。
- 基于水印的提取期望捕获删除 — 它无法看到删除;使用 CDC 或定期全量对账。
- 提取过程中进行转换 — 使重放不可行;先落地原始数据。
- 忽略速率限制/分页边界情况 — 部分拉取看起来完整;检查点并验证计数。
- 非幂等负载 — 重试和重叠窗口导致重复行。