DataHub 中的 Snowflake 摄入配置实践:从 Secrets、Recipe 到 Marketplace 高级配置
2026/9/17 8:18:58 网站建设 项目流程

DataHub 中的 Snowflake 摄入配置实践:从 Secrets、Recipe 到 Marketplace 高级配置

【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub

本篇指南基于 DataHub 仓库中的 Snowflake 配置文档 展开,讲解如何在 DataHub UI 中为 Snowflake 创建摄入源:如何把密码存入 Secrets、如何填写 Account ID / Username / Role / Warehouse 等连接字段、如何通过 Test Connection 校验权限,以及如何配置定时执行并验证摄入结果。读完本文,你可以独立完成一个可定期运行的 Snowflake 元数据摄入管道,并理解marketplaceshares等高级配置项在源码层面的解析与校验逻辑。

前置条件:Snowflake 侧的专用用户与角色

配置摄入源之前,需要先在 Snowflake 中准备好 DataHub 专用的用户与角色(详细 SQL 见 setup 文档):

  • 创建一个datahub_role角色,并授予对某个 warehouse 的OPERATEUSAGE权限;
  • 创建一个datahub_userLEGACY_SERVICE类型用户),默认角色为该角色、默认 warehouse 为上述 warehouse;
  • 对每个要接入的数据库授予USAGE(数据库/Schema)、SELECT(表/视图/动态表/外部表)、REFERENCES等权限,并执行grant imported privileges on database snowflake to role datahub_role;以便抽取血缘与用量统计。

记住这三样东西:用户名、角色名、warehouse 名——它们会原样出现在 DataHub 的 Recipe 表单里。

第一步:把 Snowflake 密码存入 DataHub Secrets

明文密码不应出现在 Recipe 中,DataHub 提供了 Secrets 机制来安全存储:

  1. 在 DataHub 界面右上角进入Ingestion标签页。如果看不到该标签页,说明当前账号缺少相应权限,需要联系 DataHub 管理员授权;
  2. 进入Secrets标签页,点击Create new secret
  3. 创建一个Password类型的 secret:
    • 名称建议取SNOWFLAKE_PASSWORD(后续 Recipe 会引用这个名称);
    • 值填写上一步在 Snowflake 中为 DataHub 用户设置的密码;
    • 可选填一段描述;
    • 点击Create完成创建。

这样密码只存在于 DataHub 的密钥存储中,Recipe YAML 里仅保留对 secret 的引用。

第二步:创建摄入源并填写连接信息

  1. 进入Sources标签页,点击Create new source
  2. 在数据源列表中选择Snowflake
  3. 填写 Snowflake Recipe 的各个字段:
表单字段对应配置说明
Account IDaccount_idSnowflake 账号标识,即主机名中.snowflakecomputing.com之前的部分,如xy12345或带区域的xy12345.us-east-2.aws
Passwordpassword点击输入框后选择上一步创建的SNOWFLAKE_PASSWORDsecret
Usernameusernamesetup 阶段创建的datahub_user
Rolerolesetup 阶段创建的datahub_role
Warehousewarehousesetup 阶段授权给该角色的 warehouse

Account ID 的填写有源码层面的保证:在 SnowflakeConnectionConfig 中,account_id的校验器会先剥离协议前缀和结尾斜杠,再剥离.{snowflake_domain}后缀(见 account_id 校验逻辑)。也就是说,即使误填了完整主机名xy12345.us-east-2.aws.snowflakecomputing.com,配置解析后仍会得到规范化的xy12345.us-east-2.awssnowflake_domain默认为snowflakecomputing.com,中国区账号可改为snowflakecomputing.cn

从源码结构看,warehouserole均为可选字段,最终通过 SQLAlchemy URI 的查询参数传给 Snowflake 驱动(见 get_sql_alchemy_url),连接的应用名固定为acryl_datahub,便于在 Snowflake 侧审计 DataHub 发出的查询。除密码认证外,该配置模型还支持KEY_PAIR_AUTHENTICATOR(密钥对)、OAUTH_AUTHENTICATOROAUTH_AUTHENTICATOR_TOKENEXTERNAL_BROWSER_AUTHENTICATOR等认证方式,并在 authentication_type 校验 中强制保证认证方式与凭据字段的一致性。

第三步:Test Connection 与权限能力检测

填写完毕后点击Test Connection。这一步不仅验证"能连上",还会校验角色是否具备抽取元数据所需的权限。

对应实现在 SnowflakeV2Source.test_connection:

  1. 用表单提交的配置字典解析出SnowflakeConnectionConfig并建立真实连接,成功后置basic_connectivity = capable
  2. 再调用check_capabilities逐项检测平台能力(如血缘、用量统计、Schema 抽取等依赖的权限),生成能力报告;
  3. 连接失败时会在报告中给出failure_reason,权限不足会抛出专门的SnowflakePermissionError(见 权限错误识别,它匹配 "Insufficient privileges" / "not authorized" 两类错误信息)。

测试通过后点击Next进入调度配置。

第四步:配置定时执行

  1. 在调度选择器中决定摄入频率——可以按分钟、小时、天、月、年设定,从下拉框中选择;
  2. 确认时区配置正确,避免定时任务在错误的本地时间执行。

点击Next继续。

第五步:保存并验证摄入结果

  1. 为摄入源命名,点击Save and Run,新的摄入源随即开始运行;
  2. 在 Ingestion 页面查看最近一次运行的状态(成功/失败);
  3. 点击加号展开该源的全部历史运行记录,点击Details查看某次运行的结果摘要;
  4. 在 Run Details 页面点击View All,可以看到本次实际摄入的实体清单;
  5. 任选一个实体打开,人工核对字段、文档等元数据是否符合预期。

到这一步,一个完整的 Snowflake 元数据摄入管道就跑通了。

高级配置:将 Snowflake 内部 Marketplace 摄入为 Data Product

如果组织内通过 Snowflake Internal Marketplace(Data Exchange 私有数据共享)买卖数据列表,并希望把它们作为 Data Product 纳入 DataHub,需要在 Recipe 中额外启用marketplace配置块。该配置由 SnowflakeMarketplaceConfig 定义,注意它针对的是内部Marketplace(IS_ORGANIZATION = TRUE的列表),不是面向外部供应商的公共 Snowflake Data Marketplace。

消费方(购买/安装列表的组织)

在 Recipe 中添加:

marketplace: enabled: true marketplace_mode: "consumer" # 默认值 # 可选:用量统计的时间窗口 start_time: "-7 days" # 默认: -1 day end_time: "now" # 必需:把导入的数据库映射到其来源 share shares: DEMO_DATABASE_SNOWFLAKE_SHARE_1754064671731: # 来自 SHOW SHARES database: "SOURCE_DATABASE" # share 中的源数据库 consumers: - database: "DEMO_DATABASE" # 本组织购买/导入的数据库 # 可选但推荐:显式的列表映射,保证精确关联 listing_global_name: "PROVIDER.REGION.LISTING_NAME" # 来自 SHOW AVAILABLE LISTINGS

提示:显式填写listing_global_name可以确保购买来的数据库被准确关联到对应的 marketplace 列表,在存在多个名称相似的列表时尤其重要。

从源码看,shares是连接跨账号血缘与 marketplace 关联的关键:SnowflakeV2Config.shares 的说明是"当当前账号拥有或消费 Snowflake share 时必填",连接器据此在当前账号与消费方/生产方账号的数据库表之间建立血缘与 siblings 关系。validate_shares 校验器 会强制执行几条约束:share 的platform_instance不能与消费方相同(不支持自共享)、被 share 包含的数据库不能再作为任何 share 的消费方、同一数据库不能同时出现在多个 share 的消费方中。完整的连接器文档在 snowflake_post.md 中进一步指出:如果不配置shares,消费方模式下 Data Product 仍会生成,但无法把购买的数据库映射回列表,实体上不会挂任何关联资产并会记录 warning。

提供方(发布列表的组织)

marketplace: enabled: true marketplace_mode: "provider" # 可选:为你的 Data Product 指定 owner internal_marketplace_owner_patterns: "^Customer.*": ["data-team"] # 可选:用量统计的时间窗口 start_time: "-30 days" end_time: "now" # 包含正在被共享的源数据库 database_pattern: allow: - "YOUR_SOURCE_DATABASE"

internal_marketplace_owner_patterns的语义在源码中有明确定义:一个"正则 -> owner 列表"的映射,正则匹配内部列表的 title 或 provider,owner 可以是用户名、组名或完整 URN(见 字段定义)。

重要:provider 模式要求imported privileges on database snowflake同时授予 roleuser 两者(setup 文档 中有对应 SQL,包括以 ACCOUNTADMIN 执行grant import share on account等步骤),因为 Snowflake 的 Share 访问授权发生在用户层级而非角色层级。marketplace_mode的字段描述(见 字段定义)也再次强调了这一点。

同时做消费与提供

设置marketplace_mode: "both"即可在同一次摄入中同时跟踪购买与发布的列表。MarketplaceMode枚举在源码中仅包含consumerproviderboth三个取值,默认为consumer(见 MarketplaceMode)。

此外SnowflakeMarketplaceConfig还提供若干可选字段,可按需启用:

  • listing_to_share_overrides:当SHOW SHARES不返回listing_global_name或自动名称匹配失败时,用listing_global_name -> share 名手动关联;
  • listing_to_schemas_overrides:provider 模式下DESC SHARE不被允许时,指定回退枚举的 Schema 列表;
  • fetch_internal_marketplace_listing_details:对每个列表执行一次DESCRIBE AVAILABLE LISTING拉取更多详情(列表很多时有性能开销);
  • marketplace_properties_as_structured_properties:把 provider、category、listing_created_on 等自定义属性写成结构化属性,使其可在 UI 中检索与过滤;
  • organization_to_domain:把 Snowflake 组织名映射到已有 DataHub domain,未映射的组织不挂 domain(marketplace 摄入不会自动创建 domain 实体)。

marketplace 的用量统计时间窗口来自连接器顶层的start_time/end_time/bucket_duration,并与主用量抽取器共用同一个RedundantUsageRunSkipHandler,因此 marketplace 用量跟随整体摄入调度,不会重复计算。

源码中的装配与测试佐证

在 snowflake_v2.py 中,当config.marketplace.enabled为真时,连接器会构造SnowflakeMarketplaceHandler并把其产出的 workunits 并入本次摄入流——即 marketplace 的 Data Product 与常规数据集在同一个管道内产出。实现位于 snowflake_marketplace.py,它基于LISTING_ACCESS_HISTORYOBJECT_DOMAIN为 table/view/materialized view/external table 的记录统计用量,并把 owner 信息规范化为 DataHub 的用户/组 URN。

配置正确性有对应的测试覆盖:

  • 单元测试 test_snowflake_marketplace.py 及质量检查 test_snowflake_marketplace_quality.py;
  • 集成测试 test_snowflake_marketplace.py 配合黄金文件 snowflake_marketplace_golden.json 校验产出实体。

小结与延伸阅读

本文完整覆盖了 configuration.md 的全部操作流程:Secrets 创建、Recipe 五要素(Account ID / Password / Username / Role / Warehouse)、Test Connection 的能力检测原理、定时调度、运行结果验证,以及 consumer/provider/both 三种 marketplace 模式的完整 YAML 示例。如需继续深入:

  • Snowflake 侧权限准备:setup.md;
  • 连接器全部配置项(血缘、用量、查询抽取、语义视图、DMF 断言等):snowflake_post.md;
  • 连接与认证实现:snowflake_connection.py;
  • 配置模型与校验规则:snowflake_config.py。

【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询