web-dev-qa-db-fra.com

Python Airflow - Retourne le résultat de PythonOperator

J'ai écrit un DAG avec plusieurs PythonOperators

task1 = af_op.PythonOperator(task_id='Data_Extraction_Environment',
                          provide_context=True,
                          python_callable=Task1, dag=dag1)

def Task1(**kwargs):
    return(kwargs['dag_run'].conf.get('file'))

De PythonOperator j'appelle la méthode "Task1". Cette méthode renvoie une valeur, cette valeur que je dois passer au prochain PythonOperator.Comment puis-je obtenir la valeur de la variable "task1" ou Comment puis-je obtenir la valeur renvoyée par la méthode Task1?

actualisé :

    def Task1(**kwargs):
          file_name = kwargs['dag_run'].conf.get[file]
          task_instance = kwargs['task_instance']
          task_instance.xcom_Push(key='file', value=file_name) 
          return file_name

  t1 = PythonOperator(task_id = 'Task1',provide_context=True,python_callable=Task1,dag=dag)

  t2 =   BashOperator(
      task_id='Moving_bucket', 
      bash_command='python /home/raw.py {{ task_instance.xcom_pull(task_ids='Task1',key='file') }} ',
      dag=dag,
    )

t2.set_upstream(t1)
11
Teja

Vous voudrez peut-être consulter le XCOM d'Airflow: https://airflow.Apache.org/concepts.html#xcoms

Si vous renvoyez une valeur à partir d'une fonction, cette valeur est stockée dans xcom. Dans votre cas, vous pouvez y accéder comme ça à partir d'un autre code Python:

task_instance = kwargs['task_instance']
task_instance.xcom_pull(task_ids='Task1')

ou dans un modèle comme celui-ci:

{{ task_instance.xcom_pull(task_ids='Task1') }}

Si vous souhaitez spécifier une clé, vous pouvez pousser dans XCOM (en étant dans une tâche):

task_instance = kwargs['task_instance']
task_instance.xcom_Push(key='the_key', value=my_str)

Plus tard, vous pouvez y accéder comme suit:

task_instance.xcom_pull(task_ids='my_task', key='the_key')

EDIT 1

Question de suivi: Au lieu d'utiliser la valeur dans une autre fonction, comment puis-je transmettre la valeur à un autre PythonOperator comme - "t2 =" BashOperator (task_id = 'Moving_bucket', bash_command = 'python /home/raw.py "% s" '% nom_fichier, dag = dag) "--- je veux accéder au nom_fichier qui est renvoyé par" Task1 ". Comment cela sera-t-il obtenu?

Tout d'abord, il me semble que la valeur est en fait pas passée à un autre PythonOperator mais à un BashOperator.

Deuxièmement, cela est déjà couvert dans ma réponse ci-dessus. Le champ bash_command est un modèle (voir template_fields dans la source: https://github.com/Apache/incubator-airflow/blob/master/airflow/operators/bash_operator.py ). Par conséquent, nous pouvons utiliser la version basée sur des modèles:

BashOperator(
  task_id='Moving_bucket', 
  bash_command='python /home/raw.py {{ task_instance.xcom_pull(task_ids='Task1') }} ',
  dag=dag,
)

EDIT 2

Explication: Airflow fonctionne comme ceci: il exécutera la tâche 1, remplira xcom puis exécutera la tâche suivante. Ainsi, pour que votre exemple fonctionne, vous devez d'abord exécuter Task1, puis exécuter Moving_bucket en aval de Task1.

Puisque vous utilisez une fonction de retour, vous pouvez également omettre le key='file' de xcom_pull et ne pas le définir manuellement dans la fonction.

18
tobi6