关于 annotating-task-lineage
annotating-task-lineage 是为 Airflow 任务添加数据沿袭标注的技能,面向需要记录输入和输出数据集的开发者。它介绍使用 inlets 和 outlets 声明沿袭,并说明何时应改用 OpenLineage 方法或自定义提取器。
主要功能
- 01为任务配置 inlets 和 outlets
- 02支持 OpenLineage 数据集
- 03支持 Airflow 3+ Assets
- 04支持 Airflow 2.4+ Datasets
- 05介绍自定义 Operator 的沿袭方式
适用场景
- 01为缺少 OpenLineage 提取器的 Operator 标注沿袭
- 02快速记录表级输入和输出关系
- 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