私はAirflowを初めて使用します。
親DAGが動的な数値(たとえばn
)をサブDAGに渡す必要があるシナリオに遭遇しました。
SubDAGはこの番号を使用して、n
並列タスクを動的に作成します。
Airflowのドキュメントでは、これを実現する方法については説明していません。だから私はいくつかの方法を探求しました:
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
また、number_of_runs
をグローバル変数として渡そうとしましたが、機能していませんでした。
また、この値をデータファイルに書き込もうとしました。しかし、サブDAGはFile doesn't exist error
をスローしています。これは、このファイルを動的に生成していることが原因である可能性があります。
誰かがこれで私を助けることができますか?.
オプション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を確認できます。
オプション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 + "' }}'" ),
書き込んでいるファイル名が動的でない場合(たとえば、タスクインスタンスごとに同じファイルを何度も上書きしている場合)、Jaimeの答えは機能します。
file_path = "/path/to/generated/file"
ただし、一意のファイル名が必要な場合、または並行して実行されるタスクのタスクインスタンスごとに異なるコンテンツをファイルに書き込む場合は、実行日または変数をテンプレートの外部に渡す方法がないため、この場合はエアフローは機能しません。 この投稿 を見てください。
私の答えを見てください ここ ここでは、xcomとサブダグを使用して以前に実行されたタスクの結果に基づいて動的にタスクを作成する方法を説明しています。