web-dev-qa-db-fra.com

Comment utiliser AirFlow pour exécuter un dossier de fichiers python?

J'ai une série de tâches Python dans un dossier de fichiers python: file1.py, file2.py, ...

J'ai lu les documents Airflow, mais je ne vois pas comment spécifier le dossier et le nom de fichier des fichiers python dans le DAG?

Je voudrais exécuter ces fichiers python (pas la fonction Python via Python)).

Tâche1: exécuter file1.py (avec un package d'importation)

Tâche2: exécuter file2.py (avec un autre package d'importation)

Ce serait utile. Merci, salutations

19
Tensor

Pour exécuter le fichier python dans son ensemble, en utilisant le BashOperator (comme dans la réponse de liferacer):

from airflow.operators.bash_operator import BashOperator

bash_task = BashOperator(
    task_id='bash_task',
    bash_command='python file1.py',
    dag=dag
)

Ensuite, pour le faire en utilisant la fonction PythonOperator appelez votre fonction main. Vous devriez déjà avoir un __main__ block, donc mettez ce qui s'y passe dans une fonction main, de sorte que votre file1.py ressemble à ceci:

def main():
    """This gets executed if `python file1` gets called."""
    # my code

if __name__ == '__main__':
    main() 

Ensuite, votre définition de dag:

from airflow.operators.python_operator import PythonOperator

import file1

python_task = PythonOperator(
    task_id='python_task',
    python_callable=file1.main,
    dag=dag
)
15
Roman

Je sais que vous demandez que vous "souhaitez exécuter ces fichiers python (pas la fonction Python via Python Operator). "Mais je vois cela comme utilisant probablement Airflow moins efficacement que vous ne pourriez l'être. Je vois aussi de la confusion dans les réponses écrites précédemment, alors voici la façon dont vous vouliez, et la façon dont je recommanderais de faire les tâches:

En supposant:

dags/
    my_dag_for_task_1_and_2.py
    tasks/
         file1.py
         file2.py

Votre demande pour éviter le PythonOperator:

#  my_dag_for_task_1_and_2.py
import datetime as dt
from airflow import DAG
from airflow.operators import BashOperator

with DAG(
    'my_dag_for_task_1_and_2',
    default_args={
        'owner': 'me',
        'start_date': datetime(…),
        …,
    }, 
    schedule_interval='8 * * * *',
) as dag:
    task_1 = BashOperator(
        task_id='task_1', 
        bash_command='/path/to/python /path/to/dags/tasks/file1.py',
    )
    task_2 = BashOperator(
        task_id='task_2', 
        bash_command='/path/to/python /path/to/dags/tasks/file2.py',
    )
    task_1 >> task_2

Vous n'avez pas écrit le Python à partir de zéro pour Airflow, mais avec PythonOperator:

#  my_dag_for_task_1_and_2.py
import datetime as dt
from airflow import DAG
from airflow.operators import PythonOperator
import tasks.file1
import tasks.file2

with DAG(
    'my_dag_for_task_1_and_2',
    default_args={
        'owner': 'me',
        'start_date': datetime(…),
        …,
    }, 
    schedule_interval='8 * * * *',
) as dag:
    task_1 = PythonOperator(
        task_id='task_1', 
        python_callable=file1.function_in_file1,
    )
    task_2 = PythonOperator(
        task_id='task_2', 
        python_callable=file2.function_in_file2,  # maybe main?
    )
    task_1 >> task_2
13
dlamblin

Vous pouvez utiliser BashOperator pour exécuter des fichiers python comme tâche

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

    seven_days_ago = datetime.combine(datetime.today() - timedelta(7),
                                      datetime.min.time())

    default_args = {
        'owner': 'airflow',
        'depends_on_past': False,
        'start_date': seven_days_ago,
        'email': ['[email protected]'],
        'email_on_failure': False,
        'email_on_retry': False,
        'retries': 1,
        'retry_delay': timedelta(minutes=5),
      )

    dag = DAG('simple', default_args=default_args)
t1 = BashOperator(
    task_id='testairflow',
    bash_command='python /home/airflow/airflow/dags/scripts/file1.py',
    dag=dag)
10
liferacer