mcpField
C
creating-openlineage-extractors

creating-openlineage-extractors

github.com/necatiarslanデータ・データベース4446 回インストール21 週間前に更新
リポジトリ

creating-openlineage-extractors について

組み込みサポートのない Airflow オペレーターからリネージを取得する OpenLineage カスタムエクストラクターの作成スキルです。OpenLineage メソッド、カスタムエクストラクター、簡易な inlets と outlets の使い分けや登録方法を扱います。

主な機能

  1. 01シナリオに応じた抽出方式の選択
  2. 02オペレーターへの OpenLineage メソッド実装
  3. 03カスタムオペレーターエクストラクターの作成
  4. 04設定または環境変数によるエクストラクター登録

活用シーン

  1. 01未対応 Airflow オペレーターのリネージ取得
  2. 02カラムレベルのリネージ抽出の追加
  3. 03inlets と outlets による簡単なテーブルレベルの記録

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/necatiarslan/airflow-vscode-extension --skill creating-openlineage-extractors

インストール後、Claude Code で/creating-openlineage-extractorsを入力して読み込まれたか確認します。

詳細

OpenLineage エクストラクターの作成

このスキルでは、組み込みサポートのない Airflow オペレーターからリネージを取得するカスタム OpenLineage エクストラクターの作成方法を説明します。

各アプローチの使い分け

シナリオアプローチ
自分が所有または保守しているオペレーターOpenLineage Methods(推奨)
変更できないサードパーティ製オペレーターCustom Extractor
カラムレベルのリネージが必要OpenLineage Methods または Custom Extractor
複雑な抽出ロジックOpenLineage Methods または Custom Extractor
シンプルなテーブルレベルのリネージInlets/Outlets(最も簡単で、優先度は最低)

アプローチ 1:OpenLineage Methods(推奨)

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
        self._rows_processed = 0

    def execute(self, context):
        self._rows_processed = self._process_data()
        return self._rows_processed

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

        return OperatorLineage(
            inputs=[Dataset(namespace="postgres://db", name=self.source_table)],
            outputs=[Dataset(namespace="postgres://db", name=self.target_table)],
        )

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

        return OperatorLineage(
            inputs=[Dataset(namespace="postgres://db", name=self.source_table)],
            outputs=[
                Dataset(
                    namespace="postgres://db",
                    name=self.target_table,
                    facets={
                        "outputStatistics": output_statistics_output_dataset.OutputStatisticsOutputDatasetFacet(
                            rowCount=self._rows_processed
                        )
                    },
                )
            ],
        )

アプローチ 2:カスタムエクストラクター

from airflow.providers.openlineage.extractors.base import BaseExtractor, OperatorLineage
from openlineage.client.event_v2 import Dataset

class MyOperatorExtractor(BaseExtractor):
    @classmethod
    def get_operator_classnames(cls) -> list[str]:
        return ["MyCustomOperator"]

    def _execute_extraction(self) -> OperatorLineage | None:
        source_table = self.operator.source_table
        target_table = self.operator.target_table

        return OperatorLineage(
            inputs=[Dataset(namespace="postgres://mydb:5432", name=f"public.{source_table}")],
            outputs=[Dataset(namespace="postgres://mydb:5432", name=f"public.{target_table}")],
        )

    def extract_on_complete(self, task_instance) -> OperatorLineage | None:
        return None

エクストラクターの登録

設定ファイル:

[openlineage]
extractors = mypackage.extractors.MyOperatorExtractor;mypackage.extractors.AnotherExtractor

環境変数:

AIRFLOW__OPENLINEAGE__EXTRACTORS='mypackage.extractors.MyOperatorExtractor;mypackage.extractors.AnotherExtractor'

コメント