mcpField
A
annotating-task-lineage

annotating-task-lineage

github.com/necatiarslan数据与数据库4447 次安装21 周前更新
代码仓库

关于 annotating-task-lineage

annotating-task-lineage 是为 Airflow 任务添加数据沿袭标注的技能,面向需要记录输入和输出数据集的开发者。它介绍使用 inlets 和 outlets 声明沿袭,并说明何时应改用 OpenLineage 方法或自定义提取器。

主要功能

  1. 01为任务配置 inlets 和 outlets
  2. 02支持 OpenLineage 数据集
  3. 03支持 Airflow 3+ Assets
  4. 04支持 Airflow 2.4+ Datasets
  5. 05介绍自定义 Operator 的沿袭方式

适用场景

  1. 01为缺少 OpenLineage 提取器的 Operator 标注沿袭
  2. 02快速记录表级输入和输出关系
  3. 03为复杂或列级沿袭选择其他实现方式

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/necatiarslan/airflow-vscode-extension --skill annotating-task-lineage

安装后在 Claude Code 中输入/annotating-task-lineage确认已加载。

详细介绍

使用 Inlets 和 Outlets 标注任务血缘

本指南将带你通过 inlets 和 outlets,为 Airflow 任务添加手动血缘标注。

何时使用此方法

场景使用 Inlets/Outlets?
操作符有 OpenLineage 方法否,直接修改 OL 方法
操作符没有内置的 OpenLineage 提取器是
简单的表级血缘已足够是
无需自定义代码即可快速设置血缘是
需要列级血缘否,使用 OpenLineage 方法或自定义提取器
需要复杂的提取逻辑否,使用 OpenLineage 方法或自定义提取器

Inlets/Outlets 支持的类型

OpenLineage 数据集(推荐)
from openlineage.client.event_v2 import Dataset

source_table = Dataset(
    namespace="postgres://mydb:5432",
    name="public.orders",
)
Airflow Assets(Airflow 3+)
from airflow.sdk import Asset

orders_asset = Asset(uri="s3://my-bucket/data/orders")
Airflow Datasets(Airflow 2.4+)
from airflow.datasets import Dataset

orders_dataset = Dataset(uri="s3://my-bucket/data/orders")

基本用法

在操作符上设置 Inlets 和 Outlets
from airflow import DAG
from airflow.operators.bash import BashOperator
from openlineage.client.event_v2 import Dataset
import pendulum

source_table = Dataset(namespace="snowflake://account", name="raw.orders")
target_table = Dataset(namespace="snowflake://account", name="staging.orders_clean")
output_file = Dataset(namespace="s3://my-bucket", name="exports/orders.parquet")

with DAG(
    dag_id="etl_with_lineage",
    start_date=pendulum.datetime(2024, 1, 1, tz="UTC"),
    schedule="@daily",
) as dag:

    transform = BashOperator(
        task_id="transform_orders",
        bash_command="echo 'transforming...'",
        inlets=[source_table],
        outlets=[target_table],
    )

    export = BashOperator(
        task_id="export_to_s3",
        bash_command="echo 'exporting...'",
        inlets=[target_table],
        outlets=[output_file],
    )

    transform >> export
多个输入和输出
from openlineage.client.event_v2 import Dataset

customers = Dataset(namespace="postgres://crm:5432", name="public.customers")
orders = Dataset(namespace="postgres://sales:5432", name="public.orders")
products = Dataset(namespace="postgres://inventory:5432", name="public.products")

daily_summary = Dataset(namespace="snowflake://account", name="analytics.daily_summary")
customer_metrics = Dataset(namespace="snowflake://account", name="analytics.customer_metrics")

aggregate_task = PythonOperator(
    task_id="build_daily_aggregates",
    python_callable=build_aggregates,
    inlets=[customers, orders, products],
    outlets=[daily_summary, customer_metrics],
)

自定义操作符

选项 1:实现 OpenLineage 方法(推荐)
from airflow.models import BaseOperator

class MyCustomOperator(BaseOperator):
    def __init__(self, source_table: str, target_table: str, **kwargs):
        super().__init__(**kwargs)
        self.source_table = source_table
        self.target_table = target_table

    def execute(self, context):
        self.log.info(f"Processing {self.source_table} -> {self.target_table}")

    def get_openlineage_facets_on_complete(self, task_instance):
        from openlineage.client.event_v2 import Dataset
        from airflow.providers.openlineage.extractors import OperatorLineage

        return OperatorLineage(
            inputs=[Dataset(namespace="warehouse://db", name=self.source_table)],
            outputs=[Dataset(namespace="warehouse://db", name=self.target_table)],
        )
选项 2:动态设置 Inlets/Outlets
from airflow.models import BaseOperator
from openlineage.client.event_v2 import Dataset

class MyCustomOperator(BaseOperator):
    def __init__(self, source_table: str, target_table: str, **kwargs):
        super().__init__(**kwargs)
        self.source_table = source_table
        self.target_table = target_table

    def execute(self, context):
        self.inlets = [Dataset(namespace="warehouse://db", name=self.source_table)]
        self.outlets = [Dataset(namespace="warehouse://db", name=self.target_table)]

评论

支持 Markdown