Confus à propos des paramètres BaseSensorOperator d'Airflow: timeout, poke_interval et mode
J'ai un peu de confusion sur le fonctionnement BaseSensorOperatordes paramètres: timeout& poke_interval. Considérez cette utilisation du capteur:
BaseSensorOperator(
soft_fail=True,
poke_interval = 4*60*60, # Poke every 4 hours
timeout = 12*60*60, # Timeout after 12 hours
)
La documentation mentionne les actes de délai d'expiration pour définir la tâche sur «échouer» après son épuisement. Mais j'utilise a soft_fail=True, je ne pense pas qu'il conserve le même comportement, car j'ai trouvé que la tâche a échoué au lieu de sauter après avoir utilisé les deux paramètres soft_failet timeout.
Alors que se passe-t-il ici?
- Le capteur pique toutes les 4 heures, et à chaque poussée, attendra la durée du délai (12 heures)?
- Ou est-ce qu'il pique toutes les 4 heures, pour un total de 3 coups, puis expire?
- Aussi, que se passe-t-il avec ces paramètres si j'utilise le mode = "reschedule"?
Voici la documentation de BaseSensorOperator
class BaseSensorOperator(BaseOperator, SkipMixin):
"""
Sensor operators are derived from this class and inherit these attributes.
Sensor operators keep executing at a time interval and succeed when
a criteria is met and fail if and when they time out.
:param soft_fail: Set to true to mark the task as SKIPPED on failure
:type soft_fail: bool
:param poke_interval: Time in seconds that the job should wait in
between each tries
:type poke_interval: int
:param timeout: Time, in seconds before the task times out and fails.
:type timeout: int
:param mode: How the sensor operates.
Options are: ``{ poke | reschedule }``, default is ``poke``.
When set to ``poke`` the sensor is taking up a worker slot for its
whole execution time and sleeps between pokes. Use this mode if the
expected runtime of the sensor is short or if a short poke interval
is requried.
When set to ``reschedule`` the sensor task frees the worker slot when
the criteria is not yet met and it's rescheduled at a later time. Use
this mode if the expected time until the criteria is met is. The poke
inteval should be more than one minute to prevent too much load on
the scheduler.
:type mode: str
"""
Réponses
Définition des termes
poke_interval: la durée b / w 'pokes' successifs (évaluation de la condition nécessaire qui est 'sentie')timeout: Le simple fait de piquer indéfiniment est inadmissible (si, par exemple, votre code de buggy pique le jour pour devenir 29 chaque fois que le mois est 2, il continuera à piquer pendant jusqu'à 4 ans). On définit donc une période maximale au-delà de laquelle on arrête de piquer et on termine (le capteur est marqué soitFAILEDouSKIPPED)soft_fail: Normalement (quandsoft_fail=False), le capteur est marqué commeFAILEDaprès la temporisation. Quandsoft_fail=True, le capteur sera plutôt marqué commeSKIPPEDaprès l'expiration du délaimode: Ceci est un peu complexe- Toute tâche (y compris le capteur) lorsqu'elle s'exécute, mange un
slotdans un pool (defaultpool ou explicitement spécifiépool); ce qui signifie essentiellement qu'il prend des ressources. - Pour les capteurs, c'est
- gaspillage : car un emplacement est consommé même lorsque nous attendons juste (ne faisant aucun travail réel
- dangereux : si votre flux de travail comporte trop de capteurs qui entrent en détection à peu près au même moment, ils peuvent geler beaucoup de ressources pendant un certain temps. En fait, trop de personnes ayant des
ExternalTaskSensors sont réputées pour mettre des flux de travail entiers (DAG) dans des blocages
- Pour surmonter ce problème, Airflow v1.10.2 a introduit
modes dans les capteursmode='poke'(par défaut) signifie le comportement existant dont nous avons discuté ci-dessusmode='reschedule'signifie qu'après une tentative de poussée , plutôt que de s'endormir , le capteur se comportera comme s'il avait échoué (lors de la tentative en cours) et son état passera deRUNNINGàUP_FOR_RETRY. De cette façon, il libèrera son emplacement, permettant à d'autres tâches de progresser en attendant une autre tentative de poussée
- Citant l'extrait de code pertinent ici
if self.reschedule: reschedule_date = timezone.utcnow() + timedelta( seconds=self._get_next_poke_interval(started_at, try_number)) raise AirflowRescheduleException(reschedule_date) else: sleep(self._get_next_poke_interval(started_at, try_number)) try_number += 1- Pour plus d'informations, lisez la section Paramètres des capteurs
- Toute tâche (y compris le capteur) lorsqu'elle s'exécute, mange un
Et maintenant répondre directement à vos questions
Q1
- Le capteur pique toutes les 4 heures, et à chaque poussée, attendra la durée du délai (12 heures)?
- Ou est-ce qu'il pique toutes les 4 heures, pour un total de 3 coups, puis expire?
le point 2 est correct
Q2
Aussi, que se passe-t-il avec ces paramètres si j'utilise le mode = "reschedule"?
Comme expliqué précédemment, chacun de ces paramètres est indépendant et le réglage mode='reschedule'ne modifie en aucune façon leur comportement
BaseSensorOperator(
soft_fail=True,
poke_interval = 4*60*60, # Poke every 4 hours
timeout = 12*60*60, # Timeout of 12 hours
mode = "reschedule"
)
Disons que les critères ne sont pas remplis au premier coup. Donc, il fonctionnera à nouveau après 4 heures d'intervalle. Mais le slot worker sera libéré pendant l'attente puisque nous utilisons le mode="reschedule".
C'est ce que j'ai compris.