web-dev-qa-db-ja.com

DAG内のAirflowタスクのステータス

同じdag内で実行中か、またはforforretryか、失敗したかのように、タスクのステータスが必要です。だから私は以下のコードを使用してそれを取得しようとしましたが、出力はありませんでした...

Auto = PythonOperator(
    task_id='test_sleep',
    python_callable=execute_on_emr,
    op_kwargs={'cmd':'python /home/hadoop/test/testsleep.py'},
    dag=dag)

logger.info(Auto)

意図は、エアフローの特定のタスクが完了したら、実行中の特定のタスクを強制終了することです。

質問はどのようにして、実行状態にあるか、失敗したか、成功したかのようにタスクの状態を取得しますか

11
Chetan J

私は似たようなことをしています。別のタスクの以前の10回の実行が成功した場合、1つのタスクを確認する必要があります。 taky2は正しい道を私に送ってくれました。それは実際にはかなり簡単です:

from airflow.models import TaskInstance
ti = TaskInstance(*your_task*, execution_date)
state = ti.current_state()

DAG内で確認したいので、DAGを指定する必要はありません。過去のn_daysをループしてステータスを確認する関数を作成しただけです。

def check_status(**kwargs):
    last_n_days = 10
    for n in range(0,last_n_days):
        date = kwargs['execution_date']- timedelta(n)
        ti = TaskInstance(*my_task*, date) #my_task is the task you defined within the DAG rather than the task_id (as in the example below: check_success_task rather than 'check_success_days_before') 
        state = ti.current_state()
        if state != 'success':
            raise ValueError('Not all previous tasks successfully completed.')

関数を呼び出すときは、provide_contextを設定してください。

check_success_task = PythonOperator(
    task_id='check_success_days_before',
    python_callable= check_status,
    provide_context=True,
    dag=dag
)

更新:別のDAGからタスクを呼び出す場合は、次のように呼び出す必要があります。

from airflow import configuration as conf
from airflow.models import DagBag, TaskInstance

dag_folder = conf.get('core','DAGS_FOLDER')
dagbag = DagBag(dag_folder)
check_dag = dagbag.dags[*my_dag_id*]
my_task = check_dag.get_task(*my_task_id*)
ti = TaskInstance(my_task, date)
7
Krischl

さて、私はあなたが何をしているのか知っていると思いますし、私は本当にそれに同意しませんが、私は答えから始めます。

単純ですがハックな方法は、task_instanceテーブルをクエリすることです。私はpostgresにいますが、構造は同じでなければなりません。まず、db呼び出しで、興味のあるタスクのtask_idsと状態を取得します。

SELECT task_id, state
FROM task_instance
WHERE dag_id = '<dag_id_attrib>'
  AND execution_date = '<execution_date_attrib>'
  AND task_id = '<task_to_check>'

これにより、監視しようとしているタスクの状態(および参照用の名前)が表示されます。状態は、単純な小文字の文字列として格納されます。

5
apathyman

Priyankによって提案されたコマンドラインインターフェイス操作を担当するコードを見てください。

https://github.com/Apache/incubator-airflow/blob/2318cea74d4f71fba353eaca9bb3c4fd3cdb06c0/airflow/bin/cli.py#L581

def task_state(args):
    dag = get_dag(args)
    task = dag.get_task(task_id=args.task_id)
    ti = TaskInstance(task, args.execution_date)
    print(ti.current_state())

したがって、同様のコードを使用して、DAGコードベース内でこれを簡単に達成できるはずです。

または、Pythonのsubprocessライブラリを使用して、コード内からこれらのCLI操作を実行することもできます。

3
taky2

これには、コマンドラインインターフェイスを使用できます。

 airflow task_state [-h] [-sd SUBDIR] dag_id task_id execution_date

詳細については、公式のエアフロードキュメントを参照してください。

http://airflow.incubator.Apache.org/cli.html

2
Priyank Mehta