web-dev-qa-db-fra.com

Précisions sur le remblayage

Je commence tout juste à utiliser airflow d'Airbnb et je ne comprends toujours pas comment/quand le remplacement est effectué. 

Plus précisément, deux cas d'utilisation me confondent:

  1. Si je lance airflow scheduler pendant quelques minutes, arrêtez-le pendant une minute, puis redémarrez-le, mon DAG semble exécuter des tâches supplémentaires pendant les 30 premières secondes environ, puis il continue comme d'habitude (exécution toutes les 10 secondes). Ces tâches supplémentaires sont-elles "remplacées" par des tâches qui n'ont pas pu être accomplies lors d'une exécution antérieure? Si oui, comment pourrais-je dire au flux d'air de ne pas remplir ces tâches? 

  2. Si je lance airflow scheduler pendant quelques minutes, puis airflow clear MY_tutorial, puis redémarre airflow scheduler, il semble exécuter une tonne de tâches supplémentaires. Ces tâches sont-elles aussi en quelque sorte "remplies"? Ou est-ce que je manque quelque chose?.

Actuellement, j'ai un très simple dag: 

default_args = {
    'owner': 'me',
    'depends_on_past': False,
    'start_date': datetime(2016, 10, 4),
    'email': ['[email protected]'],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
    # 'queue': 'bash_queue',
    # 'pool': 'backfill',
    # 'priority_weight': 10,
    # 'end_date': datetime(2016, 1, 1),
}

dag = DAG(
    'MY_tutorial', default_args=default_args, schedule_interval=timedelta(seconds=10))

# t1, t2 and t3 are examples of tasks created by instantiating operators
t1 = BashOperator(
    task_id='print_date',
    bash_command='date',
    dag=dag)

t2 = BashOperator(
    task_id='sleep',
    bash_command='sleep 5',
    retries=3,
    dag=dag)

templated_command = """
    {% for i in range(5) %}
        echo "{{ ds }}"
        echo "{{ macros.ds_add(ds, 8)}}"
        echo "{{ params.my_param }}"
    {% endfor %}
"""

t3 = BashOperator(
    task_id='templated',
    bash_command=templated_command,
    params={'my_param': 'Parameter I passed in'},
    dag=dag)

second_template = """
    touch ~/airflow/logs/test
    echo $(date) >> ~/airflow/logs/test
"""

t4 = BashOperator(
    task_id='write_test',
    bash_command=second_template,
    dag=dag)

t1.set_upstream(t4)
t2.set_upstream(t1)
t3.set_upstream(t1)

Les deux seules choses que j'ai modifiées dans ma configuration de flux d'air sont

  1. J'ai changé d'utiliser une base de données sqlite pour utiliser une base de données postgres
  2. J'utilise un CeleryExecutor au lieu d'un SequentialExecutor

Merci beaucoup pour votre aide!

16
diego_c

Lorsque vous modifiez le commutateur du planificateur sur "on" pour un DAG, le planificateur déclenche un renvoi de toutes les instances d'exécution de tâche pour lesquelles aucun statut n'a été enregistré, en commençant par la date_début que vous spécifiez dans vos "arguments_défaut".

Par exemple: Si la date de début était "2017-01-21" et que vous avez activé la bascule de planification à "2017-01-22T00: 00: 00" et que votre dag a été configuré pour s'exécuter toutes les heures, le programmateur renverra 24 dag s'exécute puis commence à courir à l'intervalle planifié.

C'est essentiellement ce qui se passe dans les deux questions. En n ° 1, il remplit les 3 pistes manquantes des 30 secondes pour lesquelles vous avez désactivé le programmateur. Dans # 2, il est en train de remplir tous les DAG va de start_date jusqu'à "maintenant".

Il y a 2 façons de contourner cela:

  1. Définissez start_date sur une date ultérieure, de manière à ce que la planification ne commence à être exécutée qu'une fois cette date atteinte. Notez que si vous modifiez la date_début d'un DAG, vous devez également modifier le nom du DAG en raison de la manière dont la date de début est stockée dans la base de données de airflow.
  2. Exécutez manuellement le renvoi depuis la ligne de commande avec l'indicateur "-m" qui indique à Airflow de ne pas exécuter le DAG, mais simplement de le marquer comme réussi dans la base de données ( https://airflow.incubator.Apache.org/cli. html ).

    par exemple .airflow backfill MY_tutorial -m -s 2016-10-04 -e 2017-01-22T14:28:30

36
bricca

Notez que depuis la version 1.8, Airflow vous permet de contrôler ce comportement à l’aide du rattrapage. Définissez catchup_by_default=False dans airflow.cfg ou catchup=False dans votre définition de DAG.

Voir https://airflow.Apache.org/scheduler.html#backfill-and-catchup

4
adaris

L’UI On/Off sur Airflow n’indique que «PAUSE», ce qui signifie que si elle est activée, elle ne fera que suspendre l’heure du déclenchement et continuera à cette date si elle est désactivée. 

0
SMDC