web-dev-qa-db-fra.com

Etat de la tâche Airflow dans le dag

J'ai besoin du statut de la tâche, comme si elle était en cours d'exécution, si elle échouait ou si elle échouait dans les mêmes délais. J'ai donc essayé de l'obtenir en utilisant le code ci-dessous, même si je n'ai aucune sortie ...

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)

L'intention est de tuer certaines tâches en cours d'exécution une fois qu'une tâche particulière sur le flux d'air est terminée.

La question est comment puis-je obtenir l'état d'une tâche comme si elle était en cours d'exécution ou si elle échouait ou réussissait

6
Chetan J

Ok, je pense que je sais ce que vous faites et je ne suis pas vraiment d'accord avec ça, mais je vais commencer par une réponse.

Une méthode simple mais astucieuse consisterait à interroger la table task_instance. Je suis en postgres, mais la structure devrait être la même. Commencez par saisir les task_ids et l'état de la tâche qui vous intéresse avec un appel à une base de données.

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>'

Cela devrait vous donner l’état (et le nom, pour référence) de la tâche que vous essayez de surveiller. State est stocké sous la forme d'une simple chaîne minuscule.

5
apathyman

Vous pouvez utiliser l'interface de ligne de commande pour cela:

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

Pour plus d'informations à ce sujet, vous pouvez vous référer à la documentation officielle sur le flux d'air:

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

2
Priyank Mehta

Examinez le code responsable de l'opération d'interface de ligne de commande proposée par 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())

Par conséquent, il semble que vous devriez pouvoir facilement accomplir cela dans votre base de code DAG en utilisant un code similaire.

Vous pouvez également exécuter ces opérations CLI à partir de votre code à l'aide de la bibliothèque subprocess de python.

1
taky2

Je fais quelque chose de similaire. Je dois vérifier pour une tâche si les 10 exécutions précédentes d'une autre tâche ont réussi. taky2 m'a envoyé sur le bon chemin. C'est en fait assez facile:

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

Comme je veux vérifier cela dans le dag, il n'est pas nécessaire de spécifier le dag. J'ai simplement créé une fonction pour parcourir les n_days passés et vérifier le statut.

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.')

Lorsque vous appelez la fonction, assurez-vous de définir Provide_context.

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

UPDATE: Lorsque vous voulez appeler une tâche depuis un autre dag, vous devez l'appeler comme suit:

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)
1
Krischl