血缘元数据采集开放标准:OpenLineage Job Facets

An Open Standard for lineage metadata collection.

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:可为 STREAMINGBATCH
  • 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
  • 集成:AIRFLOW
    • Processing type:BATCH
    • Job type:DAG|TASK
  • 集成:DBT
    • ProcessingType:BATCH
    • JobType:PROJECT|MODEL
  • 集成:FLINK
    • Processing type:STREAMING|BATCH
    • Job type:JOB

所有权 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 作业。父结构如下图所示:

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

风险提示与免责声明

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

相关推荐
cooldream20091 年前
事件驱动架构详解:触发与响应构建高效系统
架构·事件驱动架构
沛沛老爹1 年前
快速上手Spring Cloud 七:事件驱动架构与Spring Cloud
spring cloud·微服务·stream·事件驱动架构·bus
ZhangCurie2 年前
5 转向事件驱动的架构
spring boot·微服务·事件驱动架构
无知者云2 年前
产品代码都给你看了,可别再说不会DDD(十):CQRS
ddd·领域驱动设计·事件驱动架构·整洁架构
无知者云2 年前
产品代码都给你看了,可别再说不会DDD(九):领域事件
ddd·领域驱动设计·事件驱动架构·整洁架构
无知者云2 年前
产品代码都给你看了,可别再说不会DDD(八):应用服务与领域服务
ddd·领域驱动设计·事件驱动架构·整洁架构
无知者云2 年前
产品代码都给你看了,可别再说不会DDD(七):实体与值对象
ddd·领域驱动设计·事件驱动架构·整洁架构
无知者云2 年前
产品代码都给你看了,可别再说不会DDD(六):聚合根与资源库
ddd·领域驱动设计·事件驱动架构·整洁架构