web-dev-qa-db-fra.com

execution_date in airflow: nécessité d'accéder à une variable

Je suis vraiment un débutant dans ce forum. Mais je joue avec le flux d’air depuis quelque temps pour notre société. Désolé si cette question semble vraiment stupide.

J'écris un pipeline en utilisant un tas de BashOperators. En gros, pour chaque tâche, je veux simplement appeler une API REST en utilisant 'curl' 

Voici à quoi ressemble mon pipeline (version très simplifiée):

from airflow import DAG
from airflow.operators import BashOperator, PythonOperator
from dateutil import tz
import datetime

datetime_obj = datetime.datetime

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime.datetime.combine(datetime_obj.today() - datetime.timedelta(1), datetime_obj.min.time()),
    'email': ['[email protected]'],
    'email_on_failure': True,
    'email_on_retry': False,
    'retries': 2,
    'retry_delay': datetime.timedelta(minutes=5),
}


current_datetime = datetime_obj.now(tz=tz.tzlocal())

dag = DAG(
    'test_run', default_args=default_args, schedule_interval=datetime.timedelta(minutes=60))

curl_cmd='curl -XPOST "'+hostname+':8000/run?st='+current_datetime +'"'


t1 = BashOperator(
    task_id='rest-api-1',
    bash_command=curl_cmd,
    dag=dag)

Si vous remarquez que je fais current_datetime= datetime_obj.now(tz=tz.tzlocal()) Au lieu de cela, ce que je veux ici, c'est'date_exécution' 

Comment utiliser 'execution_date' directement et l'assigner à une variable de mon fichier python? 

J'ai eu ce problème général d'accès aux arguments. Toute aide sera vraiment appréciée.

Merci

31
Roger

Le constructeur PythonOperator prend un paramètre 'Provide_context' (voir https://pythonhosted.org/airflow/code.html ). Si c'est True, alors il passe un certain nombre de paramètres dans le python_callable via kwargs. kwargs ['exécution_date'] est ce que vous voulez, je crois. 

Quelque chose comme ça:

def python_method(ds, **kwargs):
    Variable.set('execution_date', kwargs['execution_date'])
    return

doit = PythonOperator(
    task_id='doit',
    provide_context=True,
    python_callable=python_method,
    dag=dag)

Je ne sais pas comment faire avec BashOperator, mais vous pouvez commencer par ce problème: https://github.com/airbnb/airflow/issues/775

19
Ziggy Eunicien

Je pense que vous ne pouvez pas affecter de variables avec des valeurs du contexte de flux d'air en dehors d'une instance de tâche, elles ne sont disponibles qu'au moment de l'exécution. En gros, il y a 2 étapes différentes quand un dag est chargé et exécuté dans un flux d'air:

  • Tout d'abord, votre fichier dag est interprété et analysé. Il doit travailler et compiler et les définitions de tâches doivent être correctes (aucune erreur de syntaxe ou quoi que ce soit). Au cours de cette étape, si vous appelez des fonctions pour renseigner certaines valeurs, celles-ci ne pourront pas accéder au contexte de flux d'air (la date d'exécution, par exemple, encore plus si vous effectuez des remplacements). 

  • La deuxième étape est l'exécution du dag. Ce n'est qu'au cours de cette seconde étape que les variables fournies par airflow (execution_date, ds, etc...) sont disponibles car elles sont liées à une exécution du dag.

Vous ne pouvez donc pas initialiser les variables globales à l'aide du contexte Airflow. Cependant, Airflow vous offre plusieurs mécanismes pour obtenir le même effet:

  1. Utiliser le modèle jinja dans votre commande (cela peut être dans une chaîne dans le code ou dans un fichier, les deux seront traités). Vous avez la liste des modèles disponibles ici: https://airflow.Apache.org/code.html#default-variables . Notez que certaines fonctions sont également disponibles, notamment pour le calcul du format delta et de la date en jours.

  2. Utilisation d’un opérateur Python dans lequel vous passez le contexte (avec l’argument provide_context). Cela vous permettra d'accéder au même modèle avec la syntaxe kwargs['<variable_name']. Si vous en avez besoin, vous pouvez renvoyer une valeur à partir d'un PythonOperator, celui-ci sera stocké dans une variable XCOM que vous pourrez utiliser plus tard dans n'importe quel modèle. L’accès aux variables XCOM utilise cette syntaxe: https://airflow.Apache.org/concepts.html#xcoms

  3. Si vous écrivez votre propre opérateur, vous pouvez accéder aux variables de débit d’air avec la variable dict context.

9
Babcool
def execute(self, context):
    execution_date = context.get("execution_date")

Cela devrait être à l'intérieur de la méthode execute () de l'opérateur

6
l0n3r4ng3r