)
data-engineering-zoomcamp 实战在 Kestra 中配置 Google Cloud PlatformGCS 数据湖与 BigQuery 数据仓库【免费下载链接】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本篇指南来自>为服务账号下载 JSON 格式的密钥文件service-account-keys该 JSON 文件正是本课提到的GCP_CREDS内容来源在项目上启用相关 APIiam.googleapis.com与iamcredentials.googleapis.com并在本地设置环境变量export GOOGLE_APPLICATION_CREDENTIALSpath/to/your/service-account-authkeys.json提示如果你希望用 Terraform 以「基础设施即代码」的方式创建 GCS Bucket 与 BigQuery Dataset可参考第一周的 terraform 目录 与 terraform-and-gcp-setup.md。不过在本课中Kestra 自身就提供了创建云资源的 Flow见第四节两条路径二选一即可。三、把 GCP 配置写入 Kestra KV Store06_gcp_kv.yaml本课文档给出的第一步非常明确调整 Flow06_gcp_kv.yaml把服务账号、GCP 项目 ID、BigQuery Dataset 和 GCS Bucket 名称连同它们的区域作为 KV Store 值填入。需要配置的四个键GCP_PROJECT_IDGCP_LOCATIONGCP_BUCKET_NAMEGCP_DATASET3.1 逐字段解析 KV Store Flow仓库中的 06_gcp_kv.yaml 完整实现如下四个任务均为io.kestra.plugin.core.kv.Set类型kvType: STRINGid: 06_gcp_kv namespace: zoomcamp tasks: - id: gcp_project_id type: io.kestra.plugin.core.kv.Set key: GCP_PROJECT_ID kvType: STRING value: kestra-sandbox # TODO replace with your project id - id: gcp_location type: io.kestra.plugin.core.kv.Set key: GCP_LOCATION kvType: STRING value: europe-west2 - id: gcp_bucket_name type: io.kestra.plugin.core.kv.Set key: GCP_BUCKET_NAME kvType: STRING value: your-name-kestra # TODO make sure its globally unique! - id: gcp_dataset type: io.kestra.plugin.core.kv.Set key: GCP_DATASET kvType: STRING value: zoomcamp各键的含义与填写要点KV 键填写值说明GCP_PROJECT_ID你的 GCP 项目 ID源码示例为kestra-sandbox需替换为自己的真实 Project IDGCP_LOCATION区域名如europe-west2Bucket 与 Dataset 的物理位置按就近/成本选择GCP_BUCKET_NAME自定义 Bucket 名称注释强调必须全局唯一GCS Bucket 名称是全球命名空间建议带个人标识GCP_DATASETDataset 名称如zoomcampBigQuery 中的数据集名后续表都建在该 Dataset 下修改后在 Kestra UI 中运行该 Flow执行完成后四个键值即持久化在 Kestra 的 KV Store 中。后续所有 Flow 都可以通过{{kv(GCP_PROJECT_ID)}}、{{kv(GCP_LOCATION)}}、{{kv(GCP_BUCKET_NAME)}}、{{kv(GCP_DATASET)}}这种表达式动态引用而不必把敏感值硬编码进每个 Flow——这正是本课把配置集中在 KV Store 的核心意义。3.2 在 Kestra 中创建GCP_CREDSSecretKV Store 保存的是「非敏感」的资源配置标识而真正敏感的服务账号 JSON 内容本课文档强调必须作为Secret保存。在 Kestra UI 中创建一个名为GCP_CREDS的 Secret内容粘贴你在 2.2 节下载的服务账号 JSON 全文。本课文档对此给出了明确的安全警告[!WARNING]GCP_CREDS服务账号包含敏感信息。请确保将其妥善保管不要提交到 Git像保管密码一样保管它。这一点在仓库源码中得到了贯彻例如 07_gcp_setup.yaml、08_gcp_taxi.yaml 中均只出现{{secret(GCP_CREDS)}}表达式凭据全文从未落入 Flow 文件本体。四、用 Kestra Flow 自动创建 GCS Bucket 与 BigQuery Dataset07_gcp_setup.yaml如果你在第一周尚未通过 Terraform 创建 GCS Bucket 和 BigQuery Dataset本课文档提供了第二种方式直接使用 Flow07_gcp_setup.yaml来创建它们。仓库中的完整实现如下id: 07_gcp_setup namespace: zoomcamp tasks: - id: create_gcs_bucket type: io.kestra.plugin.gcp.gcs.CreateBucket ifExists: SKIP storageClass: REGIONAL name: {{kv(GCP_BUCKET_NAME)}} # make sure its globally unique! - id: create_bq_dataset type: io.kestra.plugin.gcp.bigquery.CreateDataset name: {{kv(GCP_DATASET)}} ifExists: SKIP pluginDefaults: - type: io.kestra.plugin.gcp values: serviceAccount: {{secret(GCP_CREDS)}} projectId: {{kv(GCP_PROJECT_ID)}} location: {{kv(GCP_LOCATION)}} bucket: {{kv(GCP_BUCKET_NAME)}}4.1 两个创建任务的参数说明create_gcs_bucketio.kestra.plugin.gcp.gcs.CreateBucketname直接引用{{kv(GCP_BUCKET_NAME)}}即读取第三步写入 KV Store 的值保证「配置一处、处处生效」storageClass: REGIONAL使用区域级存储类成本低于多区域Multi-RegionalifExists: SKIP幂等控制Bucket 已存在时跳过而非报错允许反复执行该 Flow。create_bq_datasetio.kestra.plugin.gcp.bigquery.CreateDatasetname引用{{kv(GCP_DATASET)}}ifExists: SKIP同样幂等。4.2pluginDefaults全局注入 GCP 凭据pluginDefaults是本 Flow以及所有 GCP 相关 Flow的关键机制它为该 Flow 内所有io.kestra.plugin.gcp类型的任务统一注入默认值serviceAccount→{{secret(GCP_CREDS)}}从 Secret 读取不落盘到文件projectId→{{kv(GCP_PROJECT_ID)}}location→{{kv(GCP_LOCATION)}}bucket→{{kv(GCP_BUCKET_NAME)}}这样单个任务里就不再需要重复书写认证信息。同样的结构在 08_gcp_taxi.yaml 和 09_gcp_taxi_scheduled.yaml 中被复用构成整个云端 ELT 管线的认证基础。从源码结构可以推断后续所有 GCP 任务的执行都会依赖这三样东西GCP_CREDSSecret身份、GCP_PROJECT_ID/GCP_LOCATION目标位置、GCP_BUCKET_NAME/GCP_DATASET资源归属。4.3 运行验证确认 Kestra 已按 docker-compose.yml 启动Kestra 镜像固定为kestra/kestra:v1.1Postgres 固定为postgres:18UI 默认在http://localhost:8080/先运行06_gcp_kv确认 KV Store 中四个键值就位再运行07_gcp_setup在任务日志中看到两个任务成功或SKIP到 GCP Console 分别确认 GCS 中出现了对应 Bucket、BigQuery 中出现了对应 Dataset。五、配置如何被后续云端 ELT 流程消费本课的配置不是终点而是为下一课 11-load-taxi-data-to-bigquery.md 服务的。从 08_gcp_taxi.yaml 可以看到这些 KV 值在真实管线中的用法variables: file: {{inputs.taxi}}_tripdata_{{inputs.year}}-{{inputs.month}}.csv gcs_file: gs://{{kv(GCP_BUCKET_NAME)}}/{{vars.file}} table: {{kv(GCP_DATASET)}}.{{inputs.taxi}}_tripdata_{{inputs.year}}_{{inputs.month}}gs://{{kv(GCP_BUCKET_NAME)}}/...拼出 GCS 目标路径{{kv(GCP_DATASET)}}.{{inputs.taxi}}_tripdata_...拼出 BigQuery 表名SQL 中还会出现{{kv(GCP_PROJECT_ID)}}.{{kv(GCP_DATASET)}}.yellow_tripdata这种三层引用。而在 09_gcp_taxi_scheduled.yaml 中同样的 KV 引用与 Schedule 触发器cron 表达式每月 1 日执行结合实现月度自动装载。可以这样理解本课配置的四个 KV 键 一个 Secret就是整个云端 ELT 管线的「全局配置文件」后续无需再改任何 Flow 代码即可切换项目、区域或目标数据集。六、常见问题与排查6.1 BigQuery CSV 列数不匹配错误Module 2 README 的 Troubleshooting 部分记录了一个高频报错形式类似BigQueryError{reasoninvalid, locationnull, messageError while reading table: kestra-sandbox.zooomcamp.yellow_tripdata_2020_01, error message: CSV table references column position 17, but line contains only 14 columns.; line_number: 2103925 byte_offset_to_start_of_line: 194863028 column_index: 17 column_name: congestion_surcharge column_type: NUMERIC File: gs://anna-geller/yellow_tripdata_2020-01.csv}该报错表面看像 schema 问题但实际原因是外部源表GCS 中的 CSV 文件与 BigQuery 目标表的列数不一致——通常是网络/传输问题导致 CSV 未从上游完整下载或未正确上传到 GCS。解决办法是重新执行整个流程包括重新下载 CSV 并重新上传到 GCS即可解决。6.2 其它检查清单确认GCP_CREDSSecret 内容为完整的服务账号 JSON含private_key字段而不是 Project ID 之类的短字符串确认服务账号已具备第四节列出的四项 IAM 角色Storage Admin、Storage Object Admin、BigQuery Admin、Viewer否则创建 Bucket/Dataset 会报权限错误确认GCP_BUCKET_NAME全局唯一GCS 不允许两个用户使用同名 Bucket若修改过 KV 值或 Secret重新运行对应 Flow 使其生效若 Kestra 端口被占用可调整 docker-compose.yml 的端口映射例如把8080:8080改为18080:8080再通过http://localhost:18080/访问 UI。七、小结本课完成了从本地 Postgres 走向云端的关键一步核心配置链条可以概括为账号层创建 GCP 项目、服务账号并授予 Storage/BigQuery 管理角色下载服务账号 JSON标识层运行 06_gcp_kv.yaml将GCP_PROJECT_ID、GCP_LOCATION、GCP_BUCKET_NAME、GCP_DATASET写入 KV Store凭据层在 Kestra 中创建GCP_CREDSSecret 保存服务账号 JSON绝不入库 Git资源层运行 07_gcp_setup.yaml通过pluginDefaults自动创建 GCS Bucket 与 BigQuery Dataset消费层后续 08_gcp_taxi.yaml、09_gcp_taxi_scheduled.yaml 通过{{kv(...)}}与{{secret(...)}}表达式无缝复用这套配置。完成本课配置后即可进入下一课把 2019–2020 年的 Yellow/Green 出租车数据真正加载进 GCS 与 BigQuery并配合课程的 homework.md用回填功能补充 2021 年 1–7 月数据完成 Module 2 的实战练习。【免费下载链接】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),仅供参考