
Data Engineering Zoomcamp 本地环境搭建实战用 DuckDB dbt Core 构建 Analytics Engineering 开发环境【免费下载链接】data-engineering-zoomcampData Engineering Zoomcamp is a free 9-week course on building production-ready data pipelines. Join the course here 项目地址: https://gitcode.com/GitHub_Trending/da/data-engineering-zoomcamp本指南以 Data Engineering Zoomcamp 2027 届 Module 4Analytics Engineering的本地环境配置文档为核心讲解如何在个人电脑上以DuckDB 作为本地分析数据库、dbt Core 作为转换框架完整跑通一个真实 dbt 项目taxi_rides_ny的从零安装、数据装载、连接验证到编辑器提效的整条链路。读完本文你将掌握~/.dbt/profiles.yml的完整配置语义、2019–2020 纽约出租车数据的本地装载方案、dbt debug的验证方法以及 VS Code 下 dbt 开发扩展的正确选型并能在小内存机器上通过内存调优与增量构建稳定运行整个项目。背景为什么选择 DuckDB dbt Core 作为本地方案Module 4 的完整 dbt 项目位于 cohorts/2027/04-analytics-engineering/taxi_rides_ny其中包含 staging → intermediate → marts 三层模型stg_yellow_tripdata、stg_green_tripdata、int_trips_unioned、int_trips、fct_trips以及若干维度表。要本地运行这套模型需要一个无需云账号、可在内存中高速执行 SQL 的数据库——DuckDB 正合适它是进程内in-process嵌入式分析数据库不需要单独的服务进程也天然适配 dbt 这种模型即 SQL的开发方式。本仓库为 Module 4 提供了两条配置路径本地路径本文主题DuckDB dbt Core参见 setup/local_setup.md云端路径BigQuery dbt Cloud参见 setup/cloud_setup.md。本地路径适合零成本、离线练习与快速迭代若机器内存不足4 GB 以下官方更推荐改走云端路径或 GitHub Codespaces详见下文内存与性能调优一节。整个配置流程共 6 步安装 DuckDB → 安装 dbt → 配置 dbt Profile → 下载并装载数据 → 验证连接 → 安装 VS Code 扩展。所有 dbt 命令都必须在taxi_rides_ny/目录内执行因为 dbt_project.yml 中通过profile: taxi_rides_ny指明了项目对应的 dbt Profile 名称。第 1 步安装 DuckDBDuckDB 是本地分析负载下的理想选择它运行在你的进程内无需网络、无需账号天然适配教学与实验场景。安装方式有两种安装 CLI按操作系统从 DuckDB 官方安装说明下载对应版本的可执行文件安装 Python 客户端pip install duckdb。官方文档的偏好是安装 CLI但两种方式皆可。需要注意本教程后续的数据装载脚本会以 Python 方式import duckdb调用其 API而 dbt 侧则是通过dbt-duckdb适配器驱动 DuckDB因此两种方式在链路中都会被用到至少 Python 包必须安装。第 2 步安装 dbt 与 DuckDB 适配器一条命令安装 dbt 全家桶pip install dbt-duckdb该命令会同时安装两个组件dbt-coredbt 核心框架负责解析项目、编译 SQL、管理模型依赖与执行计划dbt-duckdbdbt 的 DuckDB 适配器让 dbt 能够连接并操作 DuckDB 数据库。提示如果你打算日后切换云数仓dbt 的适配器机制允许你通过安装不同适配器如dbt-bigquery无缝切换目标数据库而模型 SQL 大多无需改动——这正是 taxi_rides_ny 项目中sources.yml用 Jinja 条件分支同时支持两种后端的原因见下文第 3 步的源码印证。第 3 步配置 dbt Profile连接 DuckDB3.1 不需要dbt init本仓库已内置完整的 dbt 项目taxi_rides_ny/因此不要运行dbt init新建项目只需为已存在的项目配置连接。dbt 通过~/.dbt/profiles.yml找到数据库连接信息Profile 名称必须与项目中的profile: taxi_rides_ny一致。3.2 完整 Profile 配置创建或更新~/.dbt/profiles.ymltaxi_rides_ny: target: dev outputs: # DuckDB Development profile dev: type: duckdb path: taxi_rides_ny.duckdb schema: dev threads: 1 extensions: - parquet settings: memory_limit: 2GB preserve_insertion_order: false # DuckDB Production profile prod: type: duckdb path: taxi_rides_ny.duckdb schema: prod threads: 1 extensions: - parquet settings: memory_limit: 2GB preserve_insertion_order: false # Troubleshooting: # - If you have less than 4GB RAM, try setting memory_limit to 1GB # - If you have 16GB RAM, you can increase to 4GB for faster builds # - Expected build time: 5-10 minutes on most systems3.3 每个参数的语义与调优建议参数含义说明target默认激活的输出目标设为dev日常开发默认走 dev构建生产数据时用--target prod显式切换type适配器类型duckdb对应dbt-duckdb适配器pathDuckDB 数据库文件路径相对路径基于执行 dbt 命令的目录即taxi_rides_ny/会在该目录生成taxi_rides_ny.duckdb文件schema模型落库的 Schemadev 与 prod 使用不同 schemadev/prod实现开发与生产数据隔离threads并行构建模型的线程数设为 1 可显著降低并发构建带来的内存峰值压力小内存机器的推荐值extensions需要自动加载的 DuckDB 扩展本项目的 Parquet 数据装载依赖parquet扩展必须保留memory_limitDuckDB 内存上限默认 DuckDB 会用掉约 80% 系统内存容易触发 OOM建议设为总内存的约 50%如 8 GB 机器设4GB详见内存调优文档preserve_insertion_order是否保持插入顺序设为false可让 DuckDB 减少排序开销、节省内存换取构建速度参数取值建议来自duckdb_troubleshooting.md内存低于 4 GB 时把memory_limit降到1GB16 GB 以上可上调至4GB加速构建。多数机器上整个项目首次构建约需 5–10 分钟。3.4 源码印证Profile 名称如何与项目绑定打开项目的 dbt_project.yml 可以看到name: taxi_rides_ny version: 1.0.0 require-dbt-version: [1.7.0, 3.0.0] profile: taxi_rides_ny model-paths: [models] test-paths: [tests] seed-paths: [seeds] macro-paths: [macros] snapshot-paths: [snapshots]几点关键信息profile: taxi_rides_ny与~/.dbt/profiles.yml中的顶层键一一对应这是 dbt 解析连接的入口require-dbt-version: [1.7.0, 3.0.0]限定了 dbt 版本区间保证可复现性请确保你的dbt-core在此范围内各*-paths定义了 dbt 在不同目录查找模型、测试、种子、宏与快照配置必须与仓库目录结构一致。另外sources.yml通过 Jinja 条件分支同时兼容 DuckDB 与 BigQuery 两种后端佐证了本配置跨数仓的可移植设计models/staging/sources.ymlsources: - name: raw database: | {%- if target.type bigquery -%} {{ env_var(GCP_PROJECT_ID, please-add-your-gcp-project-id-here) }} {%- else -%} taxi_rides_ny {%- endif -%} schema: | {%- if target.type bigquery -%} nytaxi {%- else -%} prod {%- endif -%}即DuckDB 路径下原始数据源指向taxi_rides_ny数据库的prodschemaBigQuery 路径下则指向GCP_PROJECT_ID项目的nytaxi数据集。第 4 步下载并装载 NYC 出租车数据4.1 装载脚本全貌Profile 配置完成后需要把 2019–2020 年黄色yellow与绿色green出租车数据装载进 DuckDB。官方提供的脚本如下保存为load_data.py或在taxi_rides_ny/目录下直接执行import duckdb import requests from pathlib import Path BASE_URL https://github.com/DataTalksClub/nyc-tlc-data/releases/download def download_and_convert_files(taxi_type): data_dir Path(data) / taxi_type data_dir.mkdir(exist_okTrue, parentsTrue) for year in [2019, 2020]: for month in range(1, 13): parquet_filename f{taxi_type}_tripdata_{year}-{month:02d}.parquet parquet_filepath data_dir / parquet_filename if parquet_filepath.exists(): print(fSkipping {parquet_filename} (already exists)) continue # Download CSV.gz file csv_gz_filename f{taxi_type}_tripdata_{year}-{month:02d}.csv.gz csv_gz_filepath data_dir / csv_gz_filename response requests.get(f{BASE_URL}/{taxi_type}/{csv_gz_filename}, streamTrue) response.raise_for_status() with open(csv_gz_filepath, wb) as f: for chunk in response.iter_content(chunk_size8192): f.write(chunk) print(fConverting {csv_gz_filename} to Parquet...) con duckdb.connect() con.execute(f COPY (SELECT * FROM read_csv_auto({csv_gz_filepath})) TO {parquet_filepath} (FORMAT PARQUET) ) con.close() # Remove the CSV.gz file to save space csv_gz_filepath.unlink() print(fCompleted {parquet_filename}) def update_gitignore(): gitignore_path Path(.gitignore) # Read existing content or start with empty string content gitignore_path.read_text() if gitignore_path.exists() else # Add data/ if not already present if data/ not in content: with open(gitignore_path, a) as f: f.write(\n# Data directory\ndata/\n if content else # Data directory\ndata/\n) if __name__ __main__: # Update .gitignore to exclude data directory update_gitignore() for taxi_type in [yellow, green]: download_and_convert_files(taxi_type) con duckdb.connect(taxi_rides_ny.duckdb) con.execute(CREATE SCHEMA IF NOT EXISTS prod) for taxi_type in [yellow, green]: con.execute(f CREATE OR REPLACE TABLE prod.{taxi_type}_tripdata AS SELECT * FROM read_parquet(data/{taxi_type}/*.parquet, union_by_nametrue) ) con.close()4.2 脚本做了什么流式下载从 DataTalksClub 的 NYC TLC 数据仓库BASE_URL按{类型}_tripdata_{年}-{月}.csv.gz命名规则下载 2019–2020 共 24 个月 × 2 种车型的压缩 CSVstreamTrue 8 KB 分块写入避免一次性载入内存断点续传若同名 Parquet 已存在则跳过Skipping ...支持中断后重跑格式转换用 DuckDB 的COPY ... TO ... (FORMAT PARQUET)把 CSV.gz 转成列式 Parquet转换后立即删除 CSV.gz 释放磁盘装载入库打开taxi_rides_ny.duckdb创建prodschema并用read_parquet(data/{taxi_type}/*.parquet, union_by_nametrue)将每个目录下所有 Parquet 文件合并装载为prod.yellow_tripdata与prod.green_tripdata两张表——union_by_nametrue保证跨文件字段按名称对齐合并维护 .gitignore自动把data/目录写入.gitignore避免数 GB 的原始数据被误提交进 Git。注意数据装载的目标 schema 是prod而~/.dbt/profiles.yml中 dev 与 prod 两个 target 的 schema 分别为dev/prod。也就是说原始数据常驻prodschemadev 目标下的模型则在其devschema 中构建——这与 sources.yml 中 DuckDB 分支schema: prod的指向完全吻合。因此用 dev 目标跑模型时dbt 同样能读到prodschema 中的原始表。4.3 数据规模与下载耗时该脚本下载的 yellow/green 出租车数据横跨 24 个月包含数千万行记录DuckDB 需在本地内存中完成装载与后续建模下载耗时取决于网络状况通常需要数分钟。如果你的网络较慢或磁盘紧张可以先只跑部分月份验证链路再全量下载。第 5 步验证 dbt 与 DuckDB 的连接在taxi_rides_ny/目录下执行dbt debugdbt debug会依次校验dbt 版本与require-dbt-version约束是否满足能否定位到~/.dbt/profiles.yml中的taxi_rides_nyProfile能否用devtarget 建立到 DuckDB 的实际连接若连接成功会输出 Connection test: OK 之类的成功信息。这是配置正确性的第一道关卡任何 Profile 路径、schema 名称或扩展配置错误都会在此暴露。连接通过后即可按后续课程视频运行dbt build、dbt test与dbt docs generate等命令。第 6 步为 VS Code 安装 dbt Power User 扩展可选但推荐6.1 为什么不用官方 dbt 扩展dbt Labs 官方发布的dbt Extension基于新的 dbt Fusion 引擎要求 dbt Fusion不支持 dbt Core。而本项目使用的是 dbt Core DuckDB 的本地开发方式因此需要选择社区维护的dbt Power User by AltimateAI扩展理由如下与 dbt Core 完全兼容而非仅支持 dbt Cloud支持所有 dbt 适配器包括 DuckDB由社区积极维护且开源为本地开发提供丰富的功能集。6.2 dbt Power User 的核心能力dbt 模型的 SQL 语法高亮与格式化列级血缘lineage可视化对 dbt 模型、source、宏的自动补全交互式文档预览直接在编辑器内完成模型编译与执行。6.3 安装步骤打开 VS Code进入扩展面板快捷键CtrlShiftX/CmdShiftX搜索 dbt Power User安装dbt Power User by AltimateAI注意别装成 dbt Labs 的版本。至此你的本地 dbt 环境已完全就绪。后续的模型运行、测试与文档构建会在课程视频中逐步讲解。进阶用仓库真实模型跑通 dbt 生命周期连接验证通过后建议按 dbt 项目分层顺序逐步构建既能验证链路又能观察每层的物化策略这些策略定义在 dbt_project.yml 的models:段staging 物化为 view、intermediate 与 marts 物化为 tabledbt build --select stg_yellow_tripdata dbt build --select stg_green_tripdata dbt build --select int_trips_unioned dbt build --select int_trips dbt build --select fct_trips构建过程中可以对照以下源码理解各层职责staging 层stg_yellow_tripdata.sql统一列名vendorid→vendor_id、tpep_pickup_datetime→pickup_datetime、做类型转换并过滤vendorid is null的脏数据同时通过{% if target.name dev %}只保留 2019-01 一个月的数据实现开发环境的快速采样stg_yellow_tripdata.sql。这与 dbt_project.yml 中vars.dev_start_date/dev_end_date的采样意图一致intermediate 层int_trips_unioned.sql用UNION ALL合并绿黄两种车型并通过service_type字段区分来源、补齐 yellow 车型缺失的trip_type/ehail_feeint_trips_unioned.sqlint_trips.sql用dbt_utils.generate_surrogate_key生成trip_id、join 支付类型维度表并用QUALIFY row_number() ... 1按vendor_id, pickup_datetime, pickup_location_id, service_type去重int_trips.sqlmarts 层fct_trips.sql以materializedincrementalunique_keytrip_idincremental_strategymerge配置增量物化首次全量构建后仅按pickup_datetime增量处理新记录并 LEFT JOIN 区域维度表补充上下车 borough/zone 信息fct_trips.sql。依赖的 dbt 包dbt_utils、codegen声明在 packages.yml首次构建前需运行dbt deps拉取。种子数据如taxi_zone_lookup、payment_type_lookup的定义与测试见 seeds/seeds_properties.yml。进阶内存不足OOM时的调优方案DuckDB 是进程内数据库数千万行数据的建模完全依赖本地 RAM。官方在 duckdb_troubleshooting.md 中给出了按内存规模的判断基准4 GB RAM很可能 OOM建议改用 GitHub Codespaces免费档含 4 核/8 GB 与 8 核/16 GB 机型或云端路径8 GB RAM部分模型可能 OOM需要调低内存设置16 GB RAM默认设置即可顺畅运行。若坚持本地运行按优先级采取以下手段收紧profiles.yml内存参数显式设置memory_limit约总内存 50%、threads: 1、preserve_insertion_order: false失败后增量续跑dbt build中途失败无需全量重来修正问题后执行dbt retry只重跑失败/跳过的模型逐个模型构建用dbt build --select 模型名 --target prod一次只构建一个模型降低峰值内存见上文用仓库真实模型跑通 dbt 生命周期的命令序列利用增量模型fct_trips已配置为增量物化首次全量构建成功后后续运行只处理新数据内存压力大幅下降环境侧优化构建前关闭浏览器/IDE 等占用内存的应用使用 SSD 提升 DuckDB 内存溢出落盘速度尽量避免在 Docker 容器内运行容器内存上限可能低于系统总内存。结语与后续学习路径至此你已经完成了 Data Engineering Zoomcamp Module 4 的本地环境搭建安装 DuckDB 与 dbt、配置~/.dbt/profiles.yml双目标 Profile、下载并装载 2019–2020 出租车数据、通过dbt debug验证连接并选装了适合 dbt Core 的 VS Code 扩展。接下来就可以进入课程核心内容在 taxi_rides_ny 项目中运行模型、编写测试与生成文档。如果想了解云端替代方案BigQuery dbt Cloud参见云端配置指南若在构建中遇到内存问题完整的排查清单见DuckDB 内存故障排查模块各章讲义dbt 基础、项目结构、sources、models、seeds/macros、测试、文档、命令等可从 04-analytics-engineering/README.md 进入。提示官方在本地配置文档中留了一个进阶挑战——尝试用 Docker Compose 或 Python 虚拟环境如uv复现整套安装流程。这不仅能加深对依赖与连接机制的理解也是学习环境隔离的绝佳练习。【免费下载链接】data-engineering-zoomcampData Engineering Zoomcamp is a free 9-week course on building production-ready data pipelines. Join the course here 项目地址: https://gitcode.com/GitHub_Trending/da/data-engineering-zoomcamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考