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 元数据摄入管道,并理解marketplace、shares等高级配置项在源码层面的解析与校验逻辑。
前置条件:Snowflake 侧的专用用户与角色
配置摄入源之前,需要先在 Snowflake 中准备好 DataHub 专用的用户与角色(详细 SQL 见 setup 文档):
- 创建一个
datahub_role角色,并授予对某个 warehouse 的OPERATE、USAGE权限; - 创建一个
datahub_user(LEGACY_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 机制来安全存储:
- 在 DataHub 界面右上角进入Ingestion标签页。如果看不到该标签页,说明当前账号缺少相应权限,需要联系 DataHub 管理员授权;
- 进入Secrets标签页,点击Create new secret;
- 创建一个Password类型的 secret:
- 名称建议取
SNOWFLAKE_PASSWORD(后续 Recipe 会引用这个名称); - 值填写上一步在 Snowflake 中为 DataHub 用户设置的密码;
- 可选填一段描述;
- 点击Create完成创建。
- 名称建议取
这样密码只存在于 DataHub 的密钥存储中,Recipe YAML 里仅保留对 secret 的引用。
第二步:创建摄入源并填写连接信息
- 进入Sources标签页,点击Create new source;
- 在数据源列表中选择Snowflake;
- 填写 Snowflake Recipe 的各个字段:
| 表单字段 | 对应配置 | 说明 |
|---|---|---|
| Account ID | account_id | Snowflake 账号标识,即主机名中.snowflakecomputing.com之前的部分,如xy12345或带区域的xy12345.us-east-2.aws |
| Password | password | 点击输入框后选择上一步创建的SNOWFLAKE_PASSWORDsecret |
| Username | username | setup 阶段创建的datahub_user |
| Role | role | setup 阶段创建的datahub_role |
| Warehouse | warehouse | setup 阶段授权给该角色的 warehouse |
Account ID 的填写有源码层面的保证:在 SnowflakeConnectionConfig 中,account_id的校验器会先剥离协议前缀和结尾斜杠,再剥离.{snowflake_domain}后缀(见 account_id 校验逻辑)。也就是说,即使误填了完整主机名xy12345.us-east-2.aws.snowflakecomputing.com,配置解析后仍会得到规范化的xy12345.us-east-2.aws;snowflake_domain默认为snowflakecomputing.com,中国区账号可改为snowflakecomputing.cn。
从源码结构看,warehouse与role均为可选字段,最终通过 SQLAlchemy URI 的查询参数传给 Snowflake 驱动(见 get_sql_alchemy_url),连接的应用名固定为acryl_datahub,便于在 Snowflake 侧审计 DataHub 发出的查询。除密码认证外,该配置模型还支持KEY_PAIR_AUTHENTICATOR(密钥对)、OAUTH_AUTHENTICATOR、OAUTH_AUTHENTICATOR_TOKEN与EXTERNAL_BROWSER_AUTHENTICATOR等认证方式,并在 authentication_type 校验 中强制保证认证方式与凭据字段的一致性。
第三步:Test Connection 与权限能力检测
填写完毕后点击Test Connection。这一步不仅验证"能连上",还会校验角色是否具备抽取元数据所需的权限。
对应实现在 SnowflakeV2Source.test_connection:
- 用表单提交的配置字典解析出
SnowflakeConnectionConfig并建立真实连接,成功后置basic_connectivity = capable; - 再调用
check_capabilities逐项检测平台能力(如血缘、用量统计、Schema 抽取等依赖的权限),生成能力报告; - 连接失败时会在报告中给出
failure_reason,权限不足会抛出专门的SnowflakePermissionError(见 权限错误识别,它匹配 "Insufficient privileges" / "not authorized" 两类错误信息)。
测试通过后点击Next进入调度配置。
第四步:配置定时执行
- 在调度选择器中决定摄入频率——可以按分钟、小时、天、月、年设定,从下拉框中选择;
- 确认时区配置正确,避免定时任务在错误的本地时间执行。
点击Next继续。
第五步:保存并验证摄入结果
- 为摄入源命名,点击Save and Run,新的摄入源随即开始运行;
- 在 Ingestion 页面查看最近一次运行的状态(成功/失败);
- 点击加号展开该源的全部历史运行记录,点击Details查看某次运行的结果摘要;
- 在 Run Details 页面点击View All,可以看到本次实际摄入的实体清单;
- 任选一个实体打开,人工核对字段、文档等元数据是否符合预期。
到这一步,一个完整的 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同时授予 role和user 两者(setup 文档 中有对应 SQL,包括以 ACCOUNTADMIN 执行grant import share on account等步骤),因为 Snowflake 的 Share 访问授权发生在用户层级而非角色层级。marketplace_mode的字段描述(见 字段定义)也再次强调了这一点。
同时做消费与提供
设置marketplace_mode: "both"即可在同一次摄入中同时跟踪购买与发布的列表。MarketplaceMode枚举在源码中仅包含consumer、provider、both三个取值,默认为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_HISTORY中OBJECT_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),仅供参考