同じ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)
意図は、エアフローの特定のタスクが完了したら、実行中の特定のタスクを強制終了することです。
質問はどのようにして、実行状態にあるか、失敗したか、成功したかのようにタスクの状態を取得しますか
私は似たようなことをしています。別のタスクの以前の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)
さて、私はあなたが何をしているのか知っていると思いますし、私は本当にそれに同意しませんが、私は答えから始めます。
単純ですがハックな方法は、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>'
これにより、監視しようとしているタスクの状態(および参照用の名前)が表示されます。状態は、単純な小文字の文字列として格納されます。
Priyankによって提案されたコマンドラインインターフェイス操作を担当するコードを見てください。
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操作を実行することもできます。
これには、コマンドラインインターフェイスを使用できます。
airflow task_state [-h] [-sd SUBDIR] dag_id task_id execution_date
詳細については、公式のエアフロードキュメントを参照してください。