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:
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?
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
CeleryExecutor
au lieu d'un SequentialExecutor
Merci beaucoup pour votre aide!
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:
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
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
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.