ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DataHub 接入 dbt Cloud 元数据:显式模式与自动发现模式完整指南

DataHub 接入 dbt Cloud 元数据:显式模式与自动发现模式完整指南 DataHub 接入 dbt Cloud 元数据显式模式与自动发现模式完整指南【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub本文以开源项目 DataHub 的dbt-cloud元数据摄取模块为核心系统讲解如何将 dbt Cloud 中的模型、源、快照、测试与暴露exposure等元数据同步到 DataHub并深入剖析显式模式Explicit Mode与自动发现模式Auto-Discovery Mode两种运行方式的配置方法、适用场景与底层实现原理。读完本文你将能够独立完成 dbt Cloud 服务账号 Token 的准备工作、从 job URL 中提取三个关键 ID、编写可运行的 ingestion recipe并理解自动发现模式在源码层面的完整执行链路。概览dbt Cloud 模块能做什么dbt-cloud是 DataHub 官方提供的元数据摄取ingestion模块面向生产环境的数据目录建设场景。它从 dbt Cloud APIGraphQL 元数据接口 REST 管理接口中提取 dbt 元数据并映射为 DataHub 中的统一元数据模型。模块的具体能力定义在 dbt-cloud_post.md 中建议以其中的重要能力表Important Capabilities作为判断某个特性是否支持、是否需要额外配置的依据。结合 dbt 源模块 README该集成覆盖的核心元数据实体包括数据集/表/视图dataset、schema 字段field、容器container同时捕获表级与列级血缘lineage并支持有状态删除检测stateful deletion。具体概念映射关系如下dbt 源概念DataHub 概念说明Source源Dataset子类型SourceSeed种子Dataset子类型SeedModel模型Dataset子类型ModelSnapshot快照Dataset子类型SnapshotSemantic View语义视图Dataset子类型Semantic ViewTest测试Assertion断言—Test Result测试结果Assertion Run Result断言运行结果—Model Runs模型运行DataProcessInstance数据过程实例—值得一提的是dbt 与底层数据仓库需要分别运行摄取才能获得完整血缘dbt 摄取负责产出 dbt 节点之间的列级血缘如模型依赖 source 或 ephemeral 模型以及与目标平台节点之间的血缘如 BigQuery 表 → dbt source、dbt model → BigQuery 表/视图同时模块会自动生成 dbt 节点与数据仓库节点之间的 sibling 关系使同一实体在 UI 中同时展示两种平台标识并支持基于 dbt meta 属性自动执行打标签、加术语、指派所有者等自动化操作。前置条件在运行摄取之前需要确保以下三项就绪网络连通性能够访问 dbt Cloud 的访问地址access URL及其元数据 API 端点有效的认证凭据具有元数据读取权限的 dbt Cloud API Token元数据 API 读取权限Token 必须被授予读取该模块所需元数据 API 的权限。准备服务账号 Tokendbt Cloud 的元数据通过 GraphQL API 暴露摄取进程需要携带 API Token 进行认证。推荐的准备方式是创建一个仅含 Metadata Only 权限只读的服务账号 Token——这是官方建议的最小权限实践避免在生产环境使用具备写权限的 Token。Token 创建完成后在 recipe 中通过环境变量DBT_CLOUD_TOKEN引用避免将敏感信息硬编码进配置文件。两种操作模式总览dbt Cloud 源支持两种操作模式二者在 dbt-cloud_pre.md 中定义特性显式模式默认自动发现模式摄取范围单个指定 job项目内全部符合条件的 job是否指定 job_id必须忽略可省略run_id 行为可指定默认最新 run总是使用最新 run过滤能力无支持按 job_id 正则 include/exclude典型场景单一 job 承担全量构建多 job、且希望新 job 自动被纳入模式一显式模式Explicit Mode默认显式模式需要指定单个dbt Cloud job 作为元数据来源。使用前提是该 job 必须开启Generate docs on run运行生成文档选项并且应当处理全部/绝大部分模型否则可能需要配置多个 job 分别摄取。从 job 详情页 URL 中提取三个 ID进入 job 详情页即带有 Run History 运行历史表格的页面观察浏览器地址栏中的 URL其形态如下https://cloud.getdbt.com/next/deploy/107298/projects/175705/jobs/148094其中107298是account_id账号 ID175705是project_id项目 ID148094是job_id作业 ID。将这三个值填入 recipe 即可。显式模式 recipe 示例参考官方示例 dbt-cloud_recipe.ymlsource: type: dbt-cloud config: token: ${DBT_CLOUD_TOKEN} # 在 URL https://cloud.getdbt.com/next/deploy/107298/projects/175705/jobs/148094 中 # 107298 是 account_id175705 是 project_id148094 是 job_id account_id: ${DBT_ACCOUNT_ID} # 你的 dbt cloud 账号 ID project_id: ${DBT_PROJECT_ID} # 你的 dbt cloud 项目 ID # 模式 1显式模式指定单个 job job_id: ${DBT_JOB_ID} # 你的 dbt cloud 作业 ID run_id: # 可选指定具体的 dbt cloud run ID默认取最新一次 run target_platform: ${TARGET_PLATFORM_ID} # 例如 bigquery / postgres / snowflake 等 # convert_urns_to_lowercase: false # 可选对大小写敏感的平台如 BigQuery设为 false 以保留原始大小写默认 true # sink 配置略显式模式背后的实现GraphQL 查询链路显式模式的源码入口位于 dbt_cloud.py 的DBTCloudSource.load_nodes()。当未开启自动发现时代码直接将配置的job_id组装为待摄取列表并针对每一种节点类型向metadata_endpoint发送 GraphQL 查询。核心查询模板为query DatahubMetadataQuery_{type}($jobId: BigInt!, $runId: BigInt) { job(id: $jobId, runId: $runId) { {type} { ... } } }其中{type}依次取models、seeds、sources、snapshots、tests、exposures、semanticModels等节点类型源码中_DBT_FIELDS_BY_TYPE为每种类型定义了字段集如rawSql/compiledCode、dependsOn、materializedType、列级信息、freshness 判定条件等。目前源码明确标注metrics 类型节点暂不支持。GraphQL 请求的认证头为Authorization: Bearer token并附带X-dbt-partner-source: acryldatahub标记请求来源。每个 job 的单类节点拉取失败时源码会记录 warning 并继续处理其他类型/其他 job不会因单点失败中断整个摄取流程。模式二自动发现模式Auto-Discovery Mode自动发现模式会自动发现并摄取一个 dbt Cloud 项目内所有符合条件的 job省去手动维护 job_id 列表的负担。特性与适用场景按 dbt-cloud_pre.md 的定义该模式具有以下行为仅发现指定项目的生产环境production environment中的 job过滤开启 Generate docs on rungenerate_docsTrue的 job始终使用每个 job 的最新一次 run忽略run_id配置支持基于正则的 include/exclude 过滤特定 job_id一次运行即可摄取多个 job 的元数据。适用场景项目中有多个 dbt Cloud job希望一次全部摄取希望新增 job 后无需修改配置即可被自动纳入。配置详解自动发现模式通过auto_discovery配置块启用。以下为官方 recipe 中的完整示例source: type: dbt-cloud config: token: ${DBT_CLOUD_TOKEN} account_id: ${DBT_ACCOUNT_ID} project_id: ${DBT_PROJECT_ID} # 模式 2自动发现模式自动发现所有符合条件的 job # 取消下方注释以启用自动发现 # 注意启用 auto_discovery 后job_id 可省略若提供也会被忽略 # 且 run_id 被忽略始终使用最新 run # auto_discovery: # enabled: true # job_id_pattern: # 可选 # allow: # - .* # 包含哪些 job 的正则默认包含全部 # # deny: # # - test.* # 可选排除特定 job 的正则 target_platform: ${TARGET_PLATFORM_ID}auto_discovery子配置项定义于 dbt_cloud.py 的AutoDiscoveryConfig配置项默认值说明enabledfalse是否启用自动发现。启用后自动发现指定项目下的生产 jobrequire_generate_docsfalse为true时仅摄取开启 Generate docs on run 的 job为false默认时摄取全部生产 job不检查该开关job_id_pattern允许全部按 job_id 过滤的正则AllowDenyPattern支持allow/deny列表需要注意一处文档与源码的细节差异dbt-cloud_pre.md 将开启 Generate docs on run列为自动发现模式的硬性要求但源码中require_generate_docs的默认值是false即默认不强制该要求。对应集成测试 test_dbt_cloud_autodiscovery_integration.py 中的test_auto_discovery_includes_jobs_without_generate_docs明确验证了默认情况下即使未开启 generate_docs 的 job 也会被摄取。因此若你希望严格贯彻文档所述仅摄取生成文档的 job请在配置中显式设置require_generate_docs: true对应测试test_auto_discovery_no_jobs_with_require_generate_docs验证了在该设置下无符合条件 job 时返回空结果。源码层面的执行链路自动发现的完整流程在_auto_discover_projects_and_jobs()中实现分为三步发现生产环境调用_get_environments_for_project()通过 REST 接口GET {access_url}/api/v2/accounts/{account_id}/environments/?project_id{project_id}拉取项目全部环境然后从DBTCloudEnvironment列表中筛选出deployment_type production的环境部署类型枚举定义在 dbt_cloud_models.py取值production/staging。若找不到生产环境会抛出ValueError终止本次发现。拉取 job 列表调用_get_jobs_for_project()通过 REST 接口GET {access_url}/api/v2/accounts/{account_id}/jobs/并携带project_id与environment_id参数仅保留响应中每个 job 的id与generate_docs字段封装为DBTCloudJob。过滤与摄取对每个 job 依次执行job_id_pattern.allowed(str(job.id))正则校验并在require_generate_docs开启时校验generate_docs标志两者皆通过才进入摄取列表。被跳过的 job 会记录 warning含 job_id、account_id、project_id、environment_id 与原因并在报告report中累加total_jobs_processed_skipped。随后在load_nodes()中自动发现模式下会把run_id强制置为None确保对每个 job 都使用最新一次 run与文档描述一致然后逐个 job 发送上述 GraphQL 查询拉取各类型节点。连接测试DBTCloudSource实现了TestableSource支持test_connection预检。不同模式下的预检策略不同自动发现模式验证能否成功拉取项目的环境列表显式模式向metadata_endpoint发送一个最小 GraphQL 查询tests类型、仅请求jobId字段验证连通性。这意味着在正式运行摄取前即可通过 DataHub CLI 的test命令快速排查 Token 权限、网络与 ID 配置问题。公共配置项详解除模式相关的配置外dbt-cloud源继承自DBTCommonConfig定义于 dbt_common.py的公共配置同样关键它们在 recipe 中与模式配置平级书写配置项默认值说明access_urlhttps://cloud.getdbt.comdbt Cloud UI 访问地址需含 schemehttp/https且不带尾部斜杠多租户/独立部署需按区域调整metadata_endpoint依据access_url自动推断dbt Cloud 元数据 GraphQL 端点默认推断为https://metadata.cloud.getdbt.com/graphqltoken必填与 dbt Cloud 认证的 API Tokenaccount_id必填dbt Cloud 账号 IDproject_id必填dbt Cloud 项目 IDjob_id可选显式模式下必填自动发现模式下忽略run_id可选指定摄取的具体 run默认最新 run自动发现模式下忽略auto_discovery未启用自动发现配置块见上文external_url_modeexplore实体上的 View in dbt 链接指向 Explore UI 还是 dbt Cloud IDEidetarget_platform必填dbt 所加载的目标平台如 bigquery / redshift / postgres / snowflake不能填dbt源码校验会直接报错target_platform_instanceNone目标平台的 platform instance同一平台有多个实例如多个 redshift时用于区分envPRODDEFAULT_ENV构造 URN 时使用的命名空间环境convert_urns_to_lowercasetrue是否将数据集 URN 转为小写。对 BigQuery 等大小写敏感平台如需要保留原始标识符大小写应设为falsetag_prefixdbt:摄取时添加到标签的前缀use_identifiersfalse若模型定义了 identifier则优先使用 identifier 而非模型名entities_enabled全部开启控制各类 dbt 实体模型、测试定义、测试结果等元数据是否发射node_name_pattern允许全部按 dbt 模型名正则过滤meta_mapping/column_meta_mapping{}基于 dbt meta / 列 meta 属性自动映射标签、术语、所有者等的规则配合enable_meta_mapping默认 true使用其中metadata_endpoint的自动推断逻辑值得单独说明源码中的infer_metadata_endpoint()根据access_url的主机名推导出对应的元数据端点——标准多租户域名如cloud.getdbt.com、au.dbt.com、emea.dbt.com映射为metadata.原域名/graphqlcell 型部署如prefix.us1.dbt.com映射为prefix.metadata.us1.dbt.com/graphql自托管self-hosted场景同样加metadata.前缀。若无法推断配置校验会要求显式提供metadata_endpoint。此外配置校验validate_config有一条重要规则显式模式下job_id必填否则直接抛出ValueError——Either provide job_id or enable auto_discovery mode.即两种模式必须二选一。故障排查与注意事项模块行为受限于源端 API、权限与平台暴露的元数据dbt-cloud_post.md 建议的排查顺序是先校验基础三要素凭据Token 是否有效、是否具备 Metadata Only 权限、权限能否访问元数据 API、连通性access_url 与 metadata_endpoint 是否可达再核对范围过滤account_id / project_id / job_id 是否正确、node_name_pattern、job_id_pattern等过滤是否误伤最后检查摄取日志针对源端特有的报错信息调整配置。结合源码实现以下是一些常见的坑自动发现找不到生产环境_get_environments_for_project()会跳过deployment_type为 null 的环境若项目下没有 production 类型环境摄取直接报错——请确认 job 归属的环境类型为 production列级血缘缺失若模型的compiledCode/compiledSql为空源码会记录 Missing compiled_code 警告该模型的列级血缘将不可用job 覆盖不全源码对只做部分构建的 job会输出数据缺失警告。显式模式要求所选 job 尽量构建全量模型否则建议配置多个 job 分别摄取或改用自动发现模式大小写敏感平台BigQuery 等平台如需保留原始大小写务必设置convert_urns_to_lowercase: false同时将target_platform指向真实的数据仓库平台而非dbt。总结dbt-cloud摄取模块为生产环境的数据目录建设提供了两条清晰的接入路径显式模式以最小配置快速接入单一 job适合单一全量构建的团队自动发现模式则以生产环境 正则过滤 最新 run的组合策略自动覆盖项目内全部符合条件的 job适合多 job、频繁新增 job 的团队。理解 dbt-cloud_pre.md 中的两种模式定义、dbt-cloud_recipe.yml 中的完整配置范式以及 dbt_cloud.py 中的 GraphQL 查询与 REST 自动发现实现你就能为 dbt 数据仓库的组合构建出可持续维护的 DataHub 元数据目录并在此基础上获得表级/列级血缘、断言结果与自动化治理能力。【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表