DataHub 平台实例实战:用 platform_instance 与 dataPlatformInstance Aspect 组织多平台部署下的数据资产
【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub
本文基于 DataHub 仓库的官方文档 platform-instances 展开,讲解 DataHub 元数据模型中 Platform Instances(平台实例)机制:如何通过platform_instance配置将 Dataset 归属到具体的平台实例、dataPlatformInstanceaspect 的模型定义与 URN 生成逻辑、面向血缘类来源的platform_instance_map映射,以及基于 URN 不可变性的命名最佳实践与 Data Products、Tags 等替代组织方案。读完后你将能够正确配置多实例环境下的 ingestion recipe,并理解 DataHub 将技术标识与业务上下文分离的设计原则。
1. Dataset URN 三段键的局限性:为什么需要平台实例
DataHub 的 Dataset 元数据模型当前采用三段式主键:
- Data Platform(数据平台,例如
urn:li:dataPlatform:mysql) - Name(名称,例如
db.schema.name) - Env or Fabric(环境或 Fabric,例如
DEV、PROD等)
这种命名方式无法方便地表达同一组织在同一环境(fabric)内部署的多个平台(或技术)实例。例如,一个组织可能在生产环境拥有多套 Redshift 实例,并希望把分布在这些实例中的所有数据资产都纳入 DataHub 元数据仓库统一查看。如果两个 Redshift 实例各自都有db.orders.fact_sales表,仅靠platform + name + env三段键就会发生冲突——这正是平台实例机制要解决的问题。
注意:平台实例只是解决该问题的一种方案,它在不可变性(immutability)方面存在权衡。DataHub 还提供了组织和管理多平台实例的替代方法,详见本文第 7 节。
从v0.8.24起的版本开始,DataHub 在元数据模型中开放了平台实例支持的第一阶段。这一能力由两个主要部分构成:
dataPlatformInstanceaspect:新增到 Dataset 上,允许数据集关联到某个平台的实例;- 所有 ingestion source 的增强:允许 recipe 通过
platform_instance参数附带平台实例,使生成的 URN 从urn:li:dataset:(urn:li:dataPlatform:<platform>,<name>,ENV)格式变为urn:li:dataset:(urn:li:dataPlatform:<platform>,<instance.name>,ENV)格式。对于会向其他平台数据集产生血缘的来源(例如 Looker、Superset 等 BI 工具),还增加了专门配置项,允许 recipe 作者指定平台到实例名的映射。
2. URN 不可变性:平台实例命名的第一原则
DataHub 的 URN 是分配给实体后必须保持不变的不可变标识符。这种不可变性是维持数据完整性、血缘追踪和系统内一致引用的基础。一旦 URN 被创建,即使底层数据资产的属性发生变化,也绝不应修改它。
2.1 URN 不可变性挑战的由来
许多组织面临一个关键挑战:URN 身兼二职——它既是系统内部标识符,又是 DataHub UI 中用户可见的标识符。当组织分类体系(domains、products、systems)发生变化时,会产生如下冲突:
- 资产孤立(Orphaned Assets):URN 一旦改变,所有在 ingestion 之外添加的元数据(描述、标签、血缘、所有权)都会停留在旧资产上;
- 集成中断(Integration Disruption):依赖特定 URN 的下游应用和集成会因此失效;
- 用户困惑(User Confusion):UI 中可见的 URN 变得过时且具有误导性;
- 运维开销(Operational Overhead):团队必须将所有引用迁移到新 URN。
2.2 解法:技术标识与业务上下文中分离
在制定平台实例命名约定时,所选名称必须满足以下三条:
- 源于数据本身(Intrinsic to the data):基于数据资产的稳定、固有属性;
- 不随时间变化(Not subject to change):避免因组织重组、技术迁移或运维调整而变化的名称;
- 跨所有 ingestion 来源一致(Consistent across all ingestion sources):同一平台实例名必须在所有 recipe 中一致使用,才能保证不同来源产生的 URN 对齐。
3. dataPlatformInstance Aspect:模型层定义
dataPlatformInstanceaspect 由 PDL 模型定义,见 DataPlatformInstance.pdl:
namespace com.linkedin.common @Aspect = { "name": "dataPlatformInstance" } record DataPlatformInstance { @Searchable = { "fieldType": "URN", "addToFilters": true, "filterNameOverride": "Platform" } platform: Urn @Searchable = { "fieldType": "URN", "addToFilters": true, "filterNameOverride": "Platform Instance" "fieldName": "platformInstance" } instance: optional Urn }从该模型定义可以确认两点实现事实:
platform是必填字段,instance是可选字段——这解释了为何未配置platform_instance的既有数据集 URN 保持三段式结构,向后兼容;- 两个字段都标注了
@Searchable(fieldType: "URN")且addToFilters: true,即在搜索索引中平台与平台实例都会成为可筛选字段(UI 上分别呈现为 "Platform" 与 "Platform Instance" 过滤器)。
对应的 Python 侧实体模型见 data_platform_instance.py,其中DataPlatformInstance类将platform与platform_instance转换为DataPlatformInstanceClass,instance 部分会被封装成完整的平台实例 URN。
4. 启用平台实例:platform_instance 配置参数
各 ingestion source 的具体启用方式见其专属文档(如 metadata-ingestion/docs/sources 目录下的连接器文档),但通用模式一致:在 source config 中追加一个可选参数platform_instance。
以 MySQL 为例,下面这个 recipe 会摄入一个你命名为primary-mysql的 MySQL 实例:
source: type: mysql config: # 连接坐标 host_port: localhost:3306 platform_instance: primary-mysql database: dbname # 凭证 username: root password: example sink: # sink 配置从源码结构看,该参数的定义位于 source_common.py 的PlatformInstanceConfigMixin中:
class PlatformInstanceConfigMixin(ConfigModel): """ 任何连接平台的 source 都应继承这个类 """ platform_instance: Optional[str] = Field( default=None, description="The instance of the platform that all assets produced by this recipe belong to. " "This should be unique within the platform. " "See https://docs.datahub.com/docs/platform-instances/ for more details.", )关键约束:platform_instance默认值为None,且官方注释明确要求"The instance ... should be unique within the platform"(同一平台内必须唯一)——即实例名唯一性的边界是单个 platform,跨 platform 可以重名。所有会产出 Dataset 元数据的来源通过DatasetSourceConfigMixin(继承PlatformInstanceConfigMixin与EnvConfigMixin)获得该配置项。
4.1 URN 的实际生成逻辑
配置生效后,Dataset URN 的生成由 mce_builder.py 完成:
def make_dataplatform_instance_urn(platform: str, instance: str) -> str: if instance.startswith("urn:li:dataPlatformInstance"): return instance else: return f"urn:li:dataPlatformInstance:({make_data_platform_urn(platform)},{instance})" def make_dataset_urn_with_platform_instance( platform: str, name: str, platform_instance: Optional[str], env: str = DEFAULT_ENV ) -> str: ... return str( DatasetUrn.create_from_ids( platform_id=platform, table_name=name, env=env, platform_instance=platform_instance, ) )结合 abs/source.py 中的 MCE 构建逻辑:当self.source_config.platform_instance非空时,生成的 Dataset URN 中间段不再是原始表名路径,而是平台实例 URN,即:
urn:li:dataset:(urn:li:dataPlatform:mysql,urn:li:dataPlatformInstance:(urn:li:dataPlatform:mysql,primary-mysql),PROD)同时,同一处代码会向 MCE 的 aspect 列表中追加一个DataPlatformInstanceClass(platform 指向平台 URN、instance 指向实例 URN),使数据集在图谱中与该平台实例建立可查询的关联。这两段逻辑正是文档所述"URN 格式变化 + aspect 新增"两个能力在代码层面的对应实现。
4.2 血缘类来源:platform_instance_map
对于 Looker、Superset 这类 BI 工具(它们本身不产出数据集,而是向其他平台的数据集产生血缘),DataHub 提供了platform_instance_map配置,允许 recipe 作者声明"某平台应映射到哪个实例名",以保证血缘指向的 URN 与对应平台 ingestion recipe 生成的 URN 对齐。该配置定义于 source_common.py 的DatasetLineageProviderConfigBase:
class DatasetLineageProviderConfigBase(EnvConfigMixin): """ 任何向 Dataset 产生血缘而非直接产出 Dataset 的非 Dataset 来源 都应继承这个类。例如 Orchestrators、Pipelines、BI Tools 等。 """ platform_instance_map: Optional[Dict[str, str]] = Field( default=None, description="A holder for platform -> platform_instance mappings to generate correct dataset urns", )它是一个platform -> platform_instance的字典映射。使用原则与主配置相同:映射中的实例名必须与对应平台 ingestion recipe 中platform_instance的值完全一致,否则血缘两端 URN 无法匹配,血缘关系将断裂。例如,若 Redshift 数据集以primary-redshift实例摄入,则 Looker recipe 中应写:
source: type: looker config: ... platform_instance_map: redshift: primary-redshift5. 平台实例命名最佳实践
配置平台实例时,应选择一个易于理解且可预见地保持稳定的实例名。例如core_warehouse或finance_redshift都是可接受的名字,纯 GUID(如a37dc708-c512-4fe4-9829-401cd60ed789)也可以。请记住:无论你选择什么实例名,都需要在多个 recipe中指定同一个名字,才能确保不同来源产生的标识符对齐。
为确保 URN 不可变性和长期稳定性,平台实例名应当是内建于基础设施的技术标识符,而非业务概念;业务上下文应交由 DataHub 的 domains、ownership 等内建能力承载。
✅ 好的示例:
- 基础设施标识符:
us-east-1-cluster-1、eu-west-2-cluster-2 - 技术性命名:
primary-redshift、secondary-mysql、analytics-snowflake - GUID/UUID:
a37dc708-c512-4fe4-9829-401cd60ed789 - 基础设施编码:
rds-prod-001、redshift-analytics-01
❌ 应避免的模式:
- 组织分类学:
company.domain.product.system(domains、products、systems 会随时间变化) - 业务域名称:
customer_data_warehouse、finance_redshift(应使用 DataHub domains) - 所有权引用:
john_warehouse、sarah_analytics(应使用 DataHub ownership 功能) - 版本号:
redshift_v2、mysql_8_0(应使用 DataHub 的版本管理能力) - 临时性指示:
temp_warehouse、migration_db - 技术迁移名称:
legacy_mysql、old_redshift(应使用 DataHub tags)
关键原则:
- 技术导向:使用基础设施级标识符,而非业务概念;
- 稳定性:选择反映永久性技术特征的名称;
- 一致性:所有平台实例使用同一命名模式;
- 唯一性:确保每个平台实例拥有唯一标识符;
- 关注点分离:业务上下文交由 DataHub 的 domain 与 ownership 特性承载。
补充说明:domains、ownership、数据分类、技术迁移状态等业务上下文,应通过 DataHub 的专属特性(domains、ownership、tags 等)管理,而非内嵌进平台实例名。环境信息用 tags 表达(相比 fabric 类型更利于随时间演进做"晋升"管理),版本化则应使用 DataHub 的版本能力。
6. URN 不可变性挑战的替代方案
当组织分类体系演进时,不应通过变更 URN 来适应,而应利用 DataHub 提供的、保持 URN 不变的同时实现灵活业务上下文管理的手段。
6.1 推荐做法:技术标识与业务上下文中分离
最有效的方案是:将平台实例命名设计为技术上稳定的,同时用 DataHub 的元数据特性承载业务上下文:
- 使用稳定的技术标识符:设计不会变更的平台实例名
- ✅
us-east-1-cluster-001、anomalo-prod-01、primary-redshift - ❌
company.domain.product.system(分类学演进时会变)
- ✅
- 利用 DataHub 的业务上下文特性:
- Data Products:按业务目的对相关资产分组;
- Tags 与自定义属性:添加可随时更新的灵活元数据;
- Glossary Terms:将业务概念与技术资产关联;
- Domains:用 DataHub domains 做业务域分类。
7. 替代方案详解
DataHub 提供了多种可与平台实例互补或替代的组织概念:
7.1 Data Products
Data Products遵循 data mesh 原则,按业务目的对相关数据资产分组:
- 面向领域:由特定业务团队拥有;
- 内聚单元:相关资产(表、仪表盘、pipeline)被统一管理;
- 业务上下文:聚焦业务价值与消费者需求;
- 跨平台:可以跨越多个平台实例。
示例:
Customer Analytics Data Product ├── Tables from Redshift Cluster 1 ├── Tables from Snowflake Analytics ├── Dashboards from Looker └── Pipelines from Airflow7.2 其他元数据管理手段
Tags 与 Labels
- 目的:在不改变 URN 的前提下添加灵活的元数据上下文;
- 用例:为数据集打组织上下文标签(domain、product、system)、环境专属标签、迁移状态或遗留系统标记;
- 优势:灵活、可搜索,且更新无需变更 URN;
- 示例:为数据集打标签
domain.voice、product.billing、system.anomalo。
Custom Properties(自定义属性)
- 目的:为实体添加结构化元数据;
- 用例:以结构化数据保存组织分类学、基础设施专属元数据、随时间变化的业务上下文;
- 优势:可查询、可过滤的结构化数据;
- 示例:添加自定义属性
org_domain: "voice",域变更时可直接更新。
Glossary Terms 与业务上下文
- 目的:将业务含义与技术资产关联;
- 用例:数据集关联业务概念、平台实例关联业务域、创建业务友好的分组;
- 优势:连接技术视角与业务视角;
- 示例:将数据集关联到术语 "Customer Billing",术语重命名不影响 URN。
搜索与发现能力
- 目的:不改变 URN 即可查找和组织资产;
- 用例:按组织标签搜索、按自定义属性过滤、用 saved search 固化常见组织查询;
- 优势:无需结构性变更的灵活发现。
DataHub Actions 与自动化
- 目的:自动化元数据管理;
- 用例:按组织上下文自动打标、按业务规则自动分配所有权、跨平台实例同步元数据;
- 优势:减少人工操作、保证一致性。
7.3 方案对比
| Approach | URN Impact | Flexibility | Complexity | Best Use Case |
|---|---|---|---|---|
| Platform Instances | Changes URN | Low | Low | URN 中需要技术性区分 |
| Data Products | No change | High | High | 跨平台的业务导向分组 |
| Tags/Labels | No change | High | Low | 灵活元数据与可搜索上下文 |
| Custom Properties | No change | Medium | Medium | 结构化元数据存储 |
| Glossary Terms | No change | High | Medium | 业务上下文与领域关联 |
| Search Features | No change | High | Low | 无需变更的发现与组织 |
| Automation | No change | Medium | High | 一致的元数据管理 |
7.4 如何选型
- Platform Instances:当需要在 URN 中体现技术区分时;
- Data Products:当需要跨平台的业务导向分组时;
- Tags/Labels:当需要灵活、可搜索的元数据时;
- Custom Properties:当需要结构化元数据存储时;
- Glossary Terms:当需要业务上下文关联时;
- 组合方案:多种概念联合使用,实现全面的组织管理。
8. 小结
平台实例与数据产品分别解决了 DataHub 数据组织中的不同层面:平台实例通过修改 URN 引入技术标识符,而数据产品在不改变资产物理身份的前提下提供组织结构。对于分类体系持续演进的组织,核心在于将技术标识(写入 URN)与业务上下文(写入元数据)分离,从而同时获得不可变性与灵活性。
落地时的三条检查清单:
- 所有指向同一物理实例的 ingestion recipe(含血缘类来源的
platform_instance_map)使用完全相同的实例名; - 实例名选定后视为长期契约——后续调整业务归属请用 domains/tags/data products,而不是改 URN;
- 启用后可利用
dataPlatformInstanceaspect 上的 Platform / Platform Instance 搜索过滤器(见 DataPlatformInstance.pdl 中@Searchable注解)按实例维度检索资产,验证各来源 URN 是否已对齐。
【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考