元数据建模概念
DataHub采用模式优先【schema-first】的方法对元数据进行建模: 使用开源的Pegasus模式语言(PDL)'扩展了一组定制的注释来针对元数据建模。
DataHub存储、服务、索引和摄取层直接在元数据模型之上操作,并支持从客户端到存储层的所有强类型。
核心抽象
从概念上讲,元数据建模 使用了以下抽象:
-
Entities 实体: 实体是元数据图中的主节点,实体由如下部分组成:
- 实体类型,如CorpUser、Chart、Dashboard、Dataset
- 唯一的标识符(如’urn’)
- 一组元数据属性(也称为Aspect 方面)
-
Aspects 方面: 描述实体的特定方面的属性集合,是DataHub中写操作的最小原子单位,与同一实体相关联的多个Aspects可以独立更新,Aspect可以在实体之间共享。如DatasetProperties包含描述数据集的属性集合。
- ownership: 描述拥有一个实体的用户和组
- globalTags: 描述对与实体关联的标签的引用。
- glossaryTerms: 描述对与实体关联的术语表术语的引用。
- institutionalMemory: 与实体相关联的公司内部文件(指链接link)
- status: 描述实体的“删除”状态,即是否应软删除。
- subTypes: 描述更通用的Entity类型的一个或多个“子类型”。如a “Looker Explore” Dataset、a “View” Dataset. 特定的子类型可以暗示给定的实体存在某些额外的方面。
-
Relationships 关系: 表示两个实体之间的命名边。
- 关系是通过Aspect中的外键属性以及自定义注释(@Relationship)声明的。
- 关系允许对边进行双向遍历。例如,一个图表可以通过名为“OwnedBy”的关系将CorpUser作为其所有者,可以从Chart或CorpUser实例开始对边进行遍历
-
Identifiers (Keys & Urns) 标识符: 键是一种特殊类型的方面,它包含惟一标识单个Entity的字段,类似于关系数据库表的主键字段。
- 关键方面可以序列化到
Urns
中,urn表示用于主键查找的关键字段的字符串形式。 -
Urns
可以转换回关键方面结构【key aspect structs】,使关键方面成为一种“虚拟”方面。 - 关键方面为客户端提供了一种机制,可以方便地读取包含主键的字段,这些字段通常很有用,比如数据集名称、平台名称等。
-
Urns
提供一个友好的句柄,通过它实体可以被查询,而不需要一个完全物化的结构。
- 关键方面可以序列化到
示意图如下:
下面的元数据图由一个由3种类型的实体(CorpUser、Chart、Dashboard)、2种类型的关系(OwnedBy、Contains) 和 3种类型的元数据方面(Ownership、ChartInfo和DashboardInfo)组成的示例图。
核心实体
DataHub的**“核心”实体类型**为构成现代数据栈的数据资产建模。它们包括:
- dataPlatform 数据平台: 涉及处理、存储或可视化数据资产的外部系统。例如MySQL、Snowflake、Redshift和S3。
-
Dataset 数据集:数据集合,如Tables、Views、Streams、Document Collections、Files。 例如Postgres Tables, MongoDB Collections, or S3 files
- 数据集可以有标签、所有者、链接、术语表术语和附加的描述
- 它们也可以有特定的子类型,如"View", “Collection”, “Stream”, “Explore”
- Chart 图:从数据集派生的单个数据可视化,一个图表可以是多个仪表板的一部分。图表可以带有标签、所有者、链接、术语表术语和描述。例如Superset 或 Looker 的图表.
- Dashboard 仪表盘:用于可视化的图表集合。仪表板可以有标签、所有者、链接、术语表术语和附加的描述。例如Superset 或 Mode Dashboard
-
Data Job (Task) 数据作业: 处理数据资产的可执行作业,其中“处理”意味着消费数据、产生数据,或两者兼有。例如Airflow Task
- Data Jobs可以带有标签、所有者、链接、术语表术语和描述。
- 它们必须属于单个数据流。
- Data Flow (Pipeline) 数据流: 一组有相互依赖的数据可执行作业集合。Data Jobs可以带有标签、所有者、链接、术语表术语和描述。例如 Airflow DAG
实体注册(Entity Registry)
元数据模型是通过实体注册(Entity Registry)拼接在一起的。Entity Registry简单地说,这就是定义模型“模式”的地方。
Entity Registry被构建的2种方式:快照模型 、YAML配置模型。
从2022年1月起,DataHub已不支持将快照模型作为添加新实体的方法,这样元数据模型演变会变得更加容易,添加实体和方面变成了在YAML配置文件中添加配置的问题,而不是创建新的快照/方面文件。
快照模型
Snapshot models 快照模型: 显式地将实体绑定到与之相关的方面。如定义Dataset 实体时,使用DatasetSnapshot、DatasetAspect、DatasetProperties,这些文件的定义参见下面的源码
namespace com.linkedin.metadata.snapshot
/**
* A metadata snapshot for a specific dataset entity.
*/
@Entity = {
"name": "dataset",
"keyAspect": "datasetKey"
}
record DatasetSnapshot {
/**
* URN for the entity the metadata snapshot is associated with.
*/
urn: DatasetUrn
/**
* The list of metadata aspects associated with the dataset. Depending on the use case, this can either be all, or a selection, of supported aspects.
*/
aspects: array[DatasetAspect]
}
namespace com.linkedin.metadata.aspect
/**
* A union of all supported metadata aspects for a Dataset
*/
typeref DatasetAspect = union[
DatasetKey,
DatasetProperties,
EditableDatasetProperties,
DatasetDeprecation,
DatasetUpstreamLineage,
UpstreamLineage,
InstitutionalMemory,
Ownership,
Status,
SchemaMetadata,
EditableSchemaMetadata,
GlobalTags,
GlossaryTerms,
BrowsePaths,
DataPlatformInstance,
ViewProperties
]
namespace com.linkedin.dataset
/**
* Properties associated with a Dataset
*/
@Aspect = {
"name": "datasetProperties"
}
record DatasetProperties includes CustomProperties, ExternalReference {
/**
* Documentation of the dataset
*/
@Searchable = {
"fieldType": "TEXT",
"hasValuesFieldName": "hasDescription"
}
description: optional string
/**
* The abstracted URI such as hdfs:///data/tracking/PageViewEvent, file:///dir/file_name. Uri should not include any environment specific properties. Some datasets might not have a standardized uri, which makes this field optional (i.e. kafka topic).
*/
uri: optional Uri
/**
* [Legacy] Unstructured tags for the dataset. Structured tags can be applied via the `GlobalTags` aspect.
*/
tags: array[string] = [ ]
}
YAML配置模型
YAML models 配置模型:Entity Registry 基于一个叫YAML配置文件进行定义,在启动时提供给DataHub’s Metadata Service
- entity-registry.yml文件通过引用实体和方面的名称来声明它们。
- 在引导(boot)时,DataHub验证entity-registry.yml文件的结构,并确保它能找到与配置提供的每个方面名相关联的PDL模式(通过@Aspect注释)。
定义参见如下:
参见: v0.8.24 entity-registry.yml 或 最新版 entity-registry.yml
entities:
- name: dataset
doc: Datasets represent logical or physical data assets stored or represented in various data platforms. Tables, Views, Streams are all instances of datasets.
keyAspect: datasetKey
aspects:
- viewProperties
- subTypes
- datasetProfile
- datasetUsageStatistics
- operation
- schemaMetadata
- status
- name: dataHubPolicy
doc: DataHub Policies represent access policies granted to users or groups on metadata operations like edit, view etc.
keyAspect: dataHubPolicyKey
aspects:
- dataHubPolicyInfo
- name: dataJob
keyAspect: dataJobKey
aspects:
- datahubIngestionRunSummary
- datahubIngestionCheckpoint
- name: corpuser
doc: CorpUser represents an identity of a person (or an account) in the enterprise.
keyAspect: corpUserKey
aspects:
- corpUserInfo
- corpUserEditableInfo
- corpUserStatus
探索DataHub的元数据模型
要探索研究当前的DataHub元数据模型,可以查看下面这个high-level图,它显示了不同的实体以及它们之间的关系的边。
针对DataHub元数据模型中最流行的实体,可以参考以下链接查看:
- Dataset: Profile Documentation
- Dashboard: Profile Documentation
- User (a.k.a CorpUser): Profile Documentation
- Pipeline (a.k.a DataFlow): Profile Documentation
- Feature Table (a.k.a. MLFeatureTable): Profile Documentation
- 查看元数据模型中实体的完整列表,请浏览 这里
在元数据摄取期间,这些实体使用元数据事件表示。
参考
How does DataHub model metadata?