
OpenLineage 是一个用于元数据和血缘采集的开放标准,专为在作业运行时动态采集数据而设计。它通过统一的命名策略定义了由作业(Job)、运行实例(Run)和数据集(Dataset) 组成的通用模型,并通过可扩展的Facets机制对这些实体进行元数据增强。
该项目是 LF AI & Data 基金会的毕业级项目,处于活跃开发阶段,欢迎社区贡献。
作业 Facets
作业 Facets 适用于作业的一个具体实例:一个抽象的 process
,负责消费、执行并产生数据集(其输入和输出)。作业通过 namespace
中的 唯一名称
进行标识。作业会随时间演进,这种变化在作业运行过程中被捕获。
作业文档 Facet
Job Documentation Facet
包含作业的文档或描述。
示例:
json
{
...
"job": {
"facets": {
"documentation": {
"_producer": "https://some.producer.com/version/1.0",
"_schemaURL": "https://github.com/OpenLineage/OpenLineage/blob/main/spec/facets/DocumentationJobFacet.json",
"description": "This is the documentation of something.",
"contentType": "text/markdown"
}
}
}
...
}
该 Facet 的规范可在此处找到。
作业类型 Job Facet
Job type Job Facet
用于包含以下作业属性的 Facet:
processingType
:可为STREAMING
或BATCH
integration
:可为SPARK|DBT|AIRFLOW|FLINK
jobType
:可为QUERY|COMMAND|DAG|TASK|JOB|MODEL
示例:
json
{
...
"job": {
"facets": {
"jobType": {
"processingType": "BATCH",
"integration": "SPARK",
"jobType": "QUERY",
"_producer": "https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client",
"_schemaURL": "https://openlineage.io/spec/facets/2-0-2/JobTypeJobFacet.json"
}
}
...
}
各集成示例:
- 集成:
SPARK
- Processing type:
STREAM
|BATCH
- Job type:
JOB
|COMMAND
- Processing type:
- 集成:
AIRFLOW
- Processing type:
BATCH
- Job type:
DAG
|TASK
- Processing type:
- 集成:
DBT
- ProcessingType:
BATCH
- JobType:
PROJECT
|MODEL
- ProcessingType:
- 集成:
FLINK
- Processing type:
STREAMING
|BATCH
- Job type:
JOB
- Processing type:
所有权 Job Facet
Ownership Job Facet
该 Facet 包含拥有此特定作业的用户或用户组的信息。
示例:
json
{
...
"job": {
"facets": {
"ownership": {
"_producer": "https://some.producer.com/version/1.0",
"_schemaURL": "https://openlineage.io/spec/facets/1-0-0/OwnershipJobFacet.json",
"owners": [
{
"name": "maintainer_one",
"type": "MAINTAINER"
}
]
}
}
}
...
}
该 Facet 的规范可在此处找到。
源码 Facet
Source Code Facet
特定作业的源代码(例如 Python 脚本)。
示例:
json
{
...
"job": {
"facets": {
"sourceCode": {
"_producer": "https://some.producer.com/version/1.0",
"_schemaURL": "https://github.com/OpenLineage/OpenLineage/blob/main/spec/facets/SourceCodeJobFacet.json",
"language": "python",
"sourceCode": "print('hello, OpenLineage!')"
}
}
}
...
}
该 Facet 的规范可在此处找到。
源码位置 Facet
Source Code Location Facet
用于指示源代码存放位置的 Facet。
示例:
json
{
...
"job": {
"facets": {
"sourceCodeLocation": {
"_producer": "https://some.producer.com/version/1.0",
"_schemaURL": "https://github.com/OpenLineage/OpenLineage/blob/main/spec/facets/SourceCodeLocationJobFacet.json",
"type": "git|svn",
"url": "https://github.com/MarquezProject/marquez-airflow-quickstart/blob/693e35482bc2e526ced2b5f9f76ef83dec6ec691/dags/hello.py",
"repoUrl": "git@github.com:{org}/{repo}.git 或 https://github.com/{org}/{repo}.git|svn://<your_ip>/<repository_name>",
"path": "path/to/my/dags",
"version": "git: 提交 sha | Svn: 修订号",
"tag": "example",
"branch": "main"
}
}
}
...
}
该 Facet 的规范可在此处找到。
SQL Job Facet
SQL Job Facet 包含在特定作业中使用的 SQL 查询。
示例:
json
{
...
"job": {
"facets": {
"sql": {
"_producer": "https://some.producer.com/version/1.0",
"_schemaURL": "https://github.com/OpenLineage/OpenLineage/blob/main/spec/facets/SQLJobFacet.json",
"query": "select id, name from schema.table where id = 1"
}
}
}
...
}
该 Facet 的规范可在此处找到。
Tags Job Facet
该 Facet 包含与作业关联的标签。
示例:
json
{
...
"job": {
"facets": {
"_producer": "https://some.producer.com/version/1.0",
"_schemaURL": "https://github.com/OpenLineage/OpenLineage/blob/main/spec/facets/TagsJobFacet.json",
"tags": [{
"key": "environment",
"value": "production",
"source": "CONFIG"
}, {
"key": "team",
"value": "data-engineering",
"source": "CONFIG"
}]
}
}
...
}
该 Facet 的规范可在此处找到。
作业层级
Job Hierarchy
此功能在 OpenLineage 版本 ≥ 1.9.0 中可用。
在复杂环境中,每天会运行数千个处理作业,往往非常混乱。
我们不仅需要知道哪些作业产生了哪些数据集,还经常需要回答:
- 为什么这个作业会运行?
- 它何时运行?
- 是谁调度了这个作业?
- 为什么它在另一个作业完成后才运行?
这些问题往往模糊不清。
幸运的是,OpenLineage 不仅让我们理解数据集到数据集的血缘关系,
还在其模型中包含了对作业层级的描述。
OpenLineage 提供的工具是 ParentRunFacet。对于一次给定的运行,它描述了由哪次其他运行触发了它。
json
"parent": {
"_producer": "https://github.com/OpenLineage/OpenLineage/tree/0.0.1/integration/dbt",
"_schemaURL": "https://openlineage.io/spec/facets/1-0-0/ParentRunFacet.json",
"run": {
"runId": "f99310b4-3c3c-1a1a-2b2b-c1b95c24ff11"
},
"job": {
"namespace": "dbt",
"name": "dbt-job-name"
}
}
数据处理系统通常内置层级结构。例如,调度器使用像 Airflow DAG 这样的大型可调度单元,其中又包含更小的可执行单元,如 Airflow Task。OpenLineage 通过在其模型中镜像作业层级,无缝反映了这种自然组织方式。
复杂作业层级
OpenLineage 构建作业层级模型的简单机制还允许我们描述更复杂的环境。
在此示例中,一个 Airflow DAG 有两个任务;其中一个任务触发了一个包含两个操作的 Spark 作业。父结构如下图所示:

下图显示了这些作业事件的到达顺序:

风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。