web-dev-qa-db-fra.com

Fichiers externes dans Airflow DAG

J'essaie d'accéder à des fichiers externes dans une tâche Airflow pour lire du sql et j'obtiens "fichier introuvable". Quelqu'un l'a-t-il rencontré?

from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import datetime, timedelta

dag = DAG(
    'my_dat',
    start_date=datetime(2017, 1, 1),
    catchup=False,
    schedule_interval=timedelta(days=1)
)

def run_query():
    # read the query
    query = open('sql/queryfile.sql')
    # run the query
    execute(query)

tas = PythonOperator(
    task_id='run_query', dag=dag, python_callable=run_query)

Le journal indique ce qui suit:

IOError: [Errno 2] No such file or directory: 'sql/queryfile.sql'

Je comprends que je pourrais simplement copier et coller la requête dans le même fichier, ce n'est vraiment pas une bonne solution. Il y a plusieurs requêtes et le texte est vraiment gros, intégrez-le avec le code Python compromettrait la lisibilité.

14
Alessandro Mariani

Voici un exemple d'utilisation de la variable pour vous faciliter la tâche.

  • Ajoutez d'abord Variable dans Airflow UI -> Admin -> Variable, par exemple. {key: 'sql_path', values: 'your_sql_script_folder'}

  • Ajoutez ensuite le code suivant dans votre DAG, pour utiliser Variable from Airflow que vous venez d'ajouter.

Code DAG:

import airflow
from airflow.models import Variable

tmpl_search_path = Variable.get("sql_path")

dag = airflow.DAG(
   'tutorial',
    schedule_interval="@daily",
    template_searchpath=tmpl_search_path,  # this
    default_args=default_args
)
  • Vous pouvez maintenant utiliser le nom ou le chemin du script sql sous le dossier Variable

  • Vous pouvez en savoir plus sur this

9
zhongjiajie

Tous les chemins relatifs sont pris en référence à la variable d'environnement AIRFLOW_HOME. Essayer:

  • Donner un chemin absolu
  • placer le fichier par rapport à AIRFLOW_HOME
  • essayez de journaliser le PWD dans le python appelable, puis décidez du chemin à donner (Meilleure option)
3
Priyank Mehta