web-dev-qa-db-ja.com

AirDAWでsubDAGはどのように機能しますか? subDAGが有効になるとはどういう意味ですか?

AirflowのサブDAGのセクションを見て、オンラインで何か役立つ情報を見つけようとしましたが、サブDAGを機能させる方法を詳しく説明したものは見つかりませんでした。 subDAGを実行するための要件の1つは、それを有効にする必要があることです。サブダグをどのように有効/無効にしますか?

気流のエラーを示さないサンプルコードをいくつか作成しましたが、それを実行しようとすると、subDAGのオペレーターが実行されません。

これは私のメインのDAGコードです:

import os
from airflow import DAG
from airflow.operators import BashOperator
from datetime import datetime, timedelta
from airflow.operators.subdag_operator import SubDagOperator
from linecount_subdag import sub_dag

parent_dag_name = 'example_linecount_dag'
child_dag_name = 'example_linecount_subdag'

args = {
    'owner': 'airflow',
    'start_date': datetime(2016, 04, 20),
    'retries': 0,
}
main_dag = DAG(
    dag_id=parent_dag_name,
    default_args=args,
    schedule_interval=timedelta(minutes=5),
    start_date=datetime(2016, 04, 20),
    max_active_runs=1
)

subdag = SubDagOperator(
    subdag=sub_dag(parent_dag_name, child_dag_name, args, main_dag.schedule_interval),
    task_id=child_dag_name,
    default_args=args,
    dag=main_dag)
t = BashOperator(
    task_id='start',
    bash_command='echo "waiting for subdag..."',
    default_args=args,
    dag=main_dag)
t.set_downstream(subdag)

このコードでは、タスク「start」は成功しますが、subdagタスクは何もせず、失敗も成功もしません。

これが私のsubDAGコードです:

from airflow.models import DAG
from airflow.operators import BashOperator

# Dag is returned by a factory method
def sub_dag(parent_dag_name, child_dag_name, args, schedule_interval):
  dag = DAG(
    '%s.%s' % (parent_dag_name, child_dag_name),
    default_args=args,
    start_date=args['start_date'],
    max_active_runs=1,
  )
  t1 = BashOperator(
    task_id='count_lines',
    bash_command='cat /root/airflow/airflow.cfg | wc -l',
    default_args=args,
    xcom_Push=True,
    dag=dag)
  t2 = BashOperator(
    task_id='retrieve_val',
    bash_command='grep "airflow_home" /root/airflow/airflow.cfg',
    default_args=args,
    xcom_Push=True,
    dag=dag)
  templated_command = """
    {
        echo "{{ ti.xcom_pull(task_ids='count_lines') }}"
        echo "{{ ti.xcom_pull(task_ids='retrieve_val') }}"
    }"""
  t3 = BashOperator(
    task_id='print_values',
    bash_command=templated_command,
    default_args=args,
    dag=dag)
  t3.set_upstream(t1)
  t3.set_upstream(t2)
  return dag

このコードの3つの演算子は、ファイル「airflow.cfg」の行数を取得し、そのファイルで「airflow_home」の値を見つけて、これらの両方の値を出力して返します。このコードはそれ自体で機能するので、私はそれが問題だとは思いません。

SubDAGに演算子を実行させるには何を変更する必要がありますか?

20
Nikita Semichev

私はあなたのコードをローカルで使用しましたが、うまく動作します。

私が変更した唯一のことは、外側のDAGとサブDAGの両方をschedule_interval = Noneに設定して手動でトリガーすることでした。

開始日がdatetime(2016、04、20)で、schedule_intervalが5 minutesになるとflood多数のエアフロースケジューラbackfillリクエスト。

LocalExecutorの使用からCeleryExecutorへの切り替えが必要になる場合があります。 LocalExecutorはかなり制限されています。

次に、サブダグの最後のステップからの出力を示します。

[2017-03-08 15:35:18,994] {base_task_runner.py:95} INFO - Subtask:       {
[2017-03-08 15:35:18,994] {base_task_runner.py:95} INFO - Subtask:           echo "226"
[2017-03-08 15:35:18,994] {base_task_runner.py:95} INFO - Subtask:           echo "airflow_home = /root/airflow/"
[2017-03-08 15:35:18,994] {base_task_runner.py:95} INFO - Subtask:       }
5
jhnclvr