web-dev-qa-db-ja.com

エアフロー:動的な値をサブDAGオペレーターに渡す

私はAirflowを初めて使用します。
親DAGが動的な数値(たとえばn)をサブDAGに渡す必要があるシナリオに遭遇しました。
SubDAGはこの番号を使用して、n並列タスクを動的に作成します。

Airflowのドキュメントでは、これを実現する方法については説明していません。だから私はいくつかの方法を探求しました:

オプション-1(xcomプルを使用)

Xcom値として渡そうとしましたが、何らかの理由でSubDAGが渡された値に解決されません。

親Dagファイル

def load_dag(**kwargs):
    number_of_runs = json.dumps(kwargs['dag_run'].conf['number_of_runs'])
    dag_data = json.dumps({
        "number_of_runs": number_of_runs
    })
    return dag_data

# ------------------ Tasks ------------------------------
load_config = PythonOperator(
    task_id='load_config',
    provide_context=True,
    python_callable=load_dag,
    dag=dag)


t1 = SubDagOperator(
    task_id=CHILD_DAG_NAME,
    subdag=sub_dag(PARENT_DAG_NAME, CHILD_DAG_NAME, default_args, "'{{ ti.xcom_pull(task_ids='load_config') }}'" ),
    default_args=default_args,
    dag=dag,
)

サブダグファイル

def sub_dag(parent_dag_name, child_dag_name, args, num_of_runs):
    dag_subdag = DAG(
        dag_id='%s.%s' % (parent_dag_name, child_dag_name),
        default_args=args,
        schedule_interval=None)

    variabe_names = {}

    for i in range(num_of_runs):
        variabe_names['task' + str(i + 1)] =  DummyOperator(
        task_id='dummy_task',
        dag=dag_subdag,
    )

    return dag_subdag

オプション-2

また、number_of_runsをグローバル変数として渡そうとしましたが、機能していませんでした。

オプション-3

また、この値をデータファイルに書き込もうとしました。しかし、サブDAGはFile doesn't exist errorをスローしています。これは、このファイルを動的に生成していることが原因である可能性があります。

誰かがこれで私を助けることができますか?.

7
Maneesh Sharma

オプション3で実行しました。重要なのは、ファイルが存在しない場合に、タスクなしで有効なdagを返すことです。したがって、load_configは、必要に応じて、タスクの数または詳細情報を含むファイルを生成します。サブダグファクトリは次のようになります。

def subdag(...):
    sdag = DAG('%s.%s' % (parent, child), default_args=args, schedule_interval=timedelta(hours=1))
    file_path = "/path/to/generated/file"
    if os.path.exists(file_path):
        data_file = open(file_path)
        list_tasks = data_file.readlines()
        for task in list_tasks:
            DummyOperator(
                  task_id='task_'+task,
                  default_args=args,
                  dag=sdag,
            )
    return sdag

Dag生成では、タスクのないサブダグが表示されます。 dagの実行時に、load_configが実行された後、動的に生成されたsubdagを確認できます。

2
Jaime

オプション1は、呼び出しをxcom_pullに変更して、親dagのdag_idを含める場合に機能するはずです。デフォルトでは、xcom_pull呼び出しは、存在しない独自のdagでtask_id'load_config'を検索します。

したがって、x_com呼び出しマクロを次のように変更します。

subdag=sub_dag(PARENT_DAG_NAME, CHILD_DAG_NAME, default_args, "'{{ ti.xcom_pull(task_ids='load_config', dag_id='" + PARENT_DAG_NAME + "' }}'" ),
0
randal25

書き込んでいるファイル名が動的でない場合(たとえば、タスクインスタンスごとに同じファイルを何度も上書きしている場合)、Jaimeの答えは機能します。

file_path = "/path/to/generated/file"

ただし、一意のファイル名が必要な場合、または並行して実行されるタスクのタスクインスタンスごとに異なるコンテンツをファイルに書き込む場合は、実行日または変数をテンプレートの外部に渡す方法がないため、この場合はエアフローは機能しません。 この投稿 を見てください。

0
MarMat

私の答えを見てください ここ ここでは、xcomとサブダグを使用して以前に実行されたタスクの結果に基づいて動的にタスクを作成する方法を説明しています。

0