04 重建 dbt 流水线
在 ClickHouse 上重建 dbt 流水线的讲师指南,为什么空的聚合表不是 bug。
学员课程 04 重建 dbt 流水线 的讲师配套材料。
时间安排
约 30 分钟。唯一真正有空档的时段是第 1 步中的第二次 dbt run
(大约 8-12 分钟,把 5000 万行跑过增量模型),短到通常不需要为它单独安排一次休息,
但又长到值得边跑边讲,而不是默默看着。第 2 步(区域 dictionary)和验证查询都很快,
而且是交互式的。
讲解要点
- 把这个模块定位为验证流水线,而不是验证数据:模块 03 证明了 ClickHouse 能够容纳 5000 万行数据。本模块会验证模块 01 中的同一套 Medallion 管道, 包括 staging 视图、增量事实表、维度表重载和测试,都能在 ClickHouse 上以相同结构运行。
- 唯一值得停下来讲的 dbt 机制:
delete_insert取代了MERGE INTO(ClickHouse 没有MERGE语句),而ReplacingMergeTree是它底下的安全网, 不是它的替代品,如果delete_insert正常完成,RMT 就没有什么需要清理的; 它只在某次运行中途被打断时才起作用。 mv_live_trip_feed值得点名说明:它在 Snowflake 一侧完全没有对应物。 标准的 materialized view 只能看到触发它的那一批数据里的行;而 REFRESHABLE 的 materialized view 会按计划重跑整条查询,因此可以维护一个全生命周期的聚合结果。 这是迁移带来的新增能力,不是一次直译移植。- 在任何人开口问之前先说这一点:
agg_hourly_zone_trips在第 1 步的dbt run之后会是空的,而这是正确的,不是 bug。 它的增量过滤条件是WHERE pickup_at >= now() - INTERVAL 2 HOUR,只会匹配由实时 producer 写入的行; 而刚刚迁移过来的每一行都是历史数据。它会一直空着,直到模块 05 在切换时启动 ClickHouse 的 producer。搭档几乎必然会以为流水线坏了,抢在这个问题之前把它讲掉。
常见故障
agg_hourly_zone_trips在第 1 步之后返回 0 行,而一位搭档把它当成 bug 报上来。 它不是,见上面的讲解要点。在为agg_hourly_zone_trips花任何时间之前,先确认dim_taxi_zones(265 行)和fact_trips(约 5000 万行)都如预期地填充好了; 如果这两个都正确,那么空的聚合表就是完全按设计工作的。这是本模块的头号故障, 每次都要预期会有人问。- 第 1 步中的
dbt run失败或连不上。 本模块依赖模块 03 本应已经创建好的 ClickHouse dbt profile(~/.dbt/profiles.yml,nyc_taxi_ch)。如果那个 profile 缺失, 见 03 开通与迁移 中第 2 步的"配置 dbt profile",第 1 步就会在这里失败,比根因晚了一个模块。 - TODO:站点上的
排障 页面的
## dbt on ClickHouse小节里,没有专门针对只在这一步暴露的故障的条目。 把演练中发现的相关情况记在这里。
重置步骤
- 可以放心地重跑
dbt run,它是增量的,重复执行是安全的;这里不需要任何销毁操作。 - 在 dbt 模型或 schema 变更之后,强制对增量模型做一次完整重建:
dbt run --full-refresh(在workshop_public/snowflake_migration_lab/03-migrate-to-clickhouse/dbt/nyc_taxi_dbt_ch下执行)。 - 如果区域 dictionary 不正确或数据已过期,直接重新运行
scripts/04_create_dictionary.sql。 该脚本使用CREATE OR REPLACE DICTIONARY,可以安全地重复执行,无需先删除现有对象。 - 这里没有环境级别的重置,本模块的销毁脚本就是模块 03 下讲过的那个
workshop_public/snowflake_migration_lab/03-migrate-to-clickhouse/teardown.sh; 不要在模块进行中运行它。