[PYTHON] L'histoire du serveur Web et du DAG d'Airflow, dont le chargement prend beaucoup de temps

Noël est proche, alors parlons du serveur Web d'Airflow.

Ce que je veux dire

Modules qui composent Airflow

Le principal serveur Web cette fois-ci est l'un des modules Airflow. Pour les autres modules,

Etc. Pour plus d'informations, l'article de l'astronome est facile à comprendre.

Qu'est-ce que le serveur Web

webserver est l'écran de gestion (illustré ci-dessous), commande CLI (partie), [API](https: //airflow.apache. org / docs / stable / api.html) etc.

Nous acceptons les traitements tels que.

En interne, il a une configuration Flask + Gunicorn, et le point de terminaison de l'écran est [ici](https://github.com/apache/airflow/blob/1.10.2/airflow/www/views. Défini dans py).

Airflow UI (La figure provient d'Airflow page officielle)

Problème de DAG qui prend beaucoup de temps à charger

En plus d'accepter les demandes, le serveur Web ** lit régulièrement les fichiers DAG **.

En conséquence, s'il faut ** charger ** du fichier DAG,

quelquefois

Est-ce un avertissement? Ça a été.

Le chargement prend-il beaucoup de temps?

Il peut être déroutant que ** cela prenne beaucoup de temps pour charger le DAG ** et ** cela prenne beaucoup de temps pour exécuter DAG Run **, mais c'est une autre histoire, et le premier est le problème cette fois.

Pour donner un exemple, il s'agit d'un ** DAG qui prend beaucoup de temps à se charger **

    sleep(10000000)
    start = DummyOperator(task_id='start')

Il s'agit d'un ** DAG qui prend beaucoup de temps à exécuter ** DAG Run.

        def hoge():
            sleep(1000000)
        slow_task = PythonOperator(
            task_id='query_' + str(i),
            python_callable=hoge,
        )

Le chargement peut être lent s'il y a un grand nombre de tâches ou si vous accédez à l'extérieur ** en dehors de la tâche.

Flux d'analyse du serveur Web DAG

Pour ceux qui s'inquiètent du déroulement détaillé:

  1. Périodiquement (*) [Redémarrer le processus enfant (gunicorn worker)] au démarrage du serveur Définir sur (https://github.com/apache/airflow/blob/4a344f13d26ecbb627bb9968895b290bfd86e4da/airflow/cli/commands/webserver_command.py#L146)
  2. [L'objet DagBag est créé] lors du chargement du fichier de point final (https://github.com/apache/airflow/blob/cb8b2a1dc64c3ea6ba445893c65c6c953dfb476a/airflow/www/views.py#L92)
  3. Lors de la création de l'objet DagBag, le fichier DAG est analysé (https://github.com/apache/airflow/blob/cb8b2a1dc64c3ea6ba445893c65c6c953dfb476a/airflow/models.py#L321)

Relation avec le nombre de tâches

Cloud Composer (Airflow 1.10.2) - Je l'ai essayé avec DAG uniquement pour BigQuery Operator:

Si seule la vue graphique ou la vue arborescente est lourde, il semble bon de modifier default_dag_run_display_number.

Une histoire d'avenir radieuse

Certaines améliorations ont été proposées pour ce "DAG de chargement".

Cloud Composer implémente une option pour définir le chargement du DAG asynchrone sur le serveur Web (https://cloud.google.com/composer/docs/how-to/accessing/airflow-web-interface#asynchronous-load) Il a également été [porté] sur Airflow 1.10.4 (https://issues.apache.org/jira/browse/AIRFLOW-4924).

C'est toujours un brouillon, mais [AIP-24 DAG Persistence in DB using JSON for Airflow Webserver et (facultatif) Scheduler](https://cwiki.apache.org/confluence/display/AIRFLOW/AIP-24+DAG+Persistence+in La proposition (+ DB + en utilisant + JSON + pour + Airflow + Webserver + et +% 28optional% 29 + Scheduler? FocusedCommentId = 123898950) est un changement plus important.

Nous proposons des options. (Il semble qu'il ne soit pas bon que le serveur Web ait un état en premier lieu Il semble qu'il y ait une histoire))

Serveur Web Cloud Composer

Remarque sur le serveur Web Cloud Composer:

À propos, Astronomer.io peut changer la taille de vCPU / Memory.

Recommended Posts

L'histoire du serveur Web et du DAG d'Airflow, dont le chargement prend beaucoup de temps
Je suis à Singapour en ce moment Une histoire sur la création d'un LineBot et la volonté de faire un travail mémorable
Une histoire sur le portage du code de "Essayez de comprendre comment fonctionne Linux" sur Rust
Je souhaite enregistrer l'heure d'exécution et conserver un journal.
L'histoire de Python et l'histoire de NaN
[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
Il est étonnamment difficile d'obtenir une liste de la dernière date et heure de connexion des espaces de travail
L'histoire du retour au front pour la première fois en 5 ans et de la refactorisation de Python Django
L'histoire de l'exportation d'un programme
L'histoire de la création d'un outil pour charger une image avec Python ⇒ l'enregistrer sous un autre nom
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
L'histoire de la création d'une caméra sonore avec Touch Designer et ReSpeaker
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
L'histoire d'essayer de reconnecter le client
L'histoire de la mise en place de MeCab dans Ubuntu 16.04
L'histoire d'essayer deep3d et de perdre
L'histoire du traitement A du blackjack (python)
L'histoire du changement de pep8 en pycodestyle
J'ai fait un outil pour estimer le temps d'exécution de cron (+ débuts de PyPI)
Expérimentez pour collecter des tweets pendant une longue période (agrégation et confirmation du contenu)
L'histoire de l'adresse IPv6 que je souhaite conserver au minimum
Un débutant en programmation a essayé de vérifier le temps d'exécution du tri, etc.
L'histoire de la fabrication d'une boîte qui interconnecte la mémoire AL de Pepper et MQTT
Comment compter le nombre d'éléments dans Django et sortir dans le modèle
Je veux créer un lecteur de musique et enregistrer de la musique en même temps
CentOS 7 avec la configuration LVM prend beaucoup de temps à s'arrêter.
Assurez-vous que le prétraitement au moment de la création du modèle de prédiction et de la prédiction est aligné
Créez un environnement python pour apprendre la théorie et la mise en œuvre de l'apprentissage profond
L'histoire d'un technicien de haut niveau essayant de prédire la survie du Titanic
Comment calculer la volatilité d'une marque
L'histoire de la création d'un générateur d'icônes mel
Prise en compte des forces et faiblesses de Python
Histoire de passer de Pipenv à la poésie
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
Je ne trouve pas l'horloge tsc! ?? L'histoire d'essayer d'écrire un patch de noyau
Une histoire d'essais et d'erreurs essayant de créer un groupe d'utilisateurs dynamique dans Slack
L'histoire du passage de WoSign à Let's Encrypt pour un certificat SSL gratuit
Une histoire sur la tentative de contribuer à l'analyse COVID-19 avec l'offre gratuite d'AWS et l'échec
L'histoire du portage du code de C vers Go (et vers la spécification du langage)
Je voulais juste extraire les données de la date et de l'heure souhaitées avec Django
Une note de malentendu lors de la tentative de chargement de l'intégralité du module self-made avec Python3
Une histoire sur la tentative d'introduire Linter au milieu d'un projet Python (Flask)
Il est temps de réfléchir sérieusement à la définition et aux compétences des data scientists
[Note de compression d'information 003] Un plan pour compresser les conférences et les écritures du tableau d'un professeur d'électromagnétique dans une université terne en un Jpeg.
L'histoire du lancement d'un serveur Minecraft depuis Discord
Une histoire qui réduit l'effort de fonctionnement / maintenance
L'histoire de Python sans opérateurs d'incrémentation et de décrémentation.
Un mémo pour comprendre visuellement l'axe des pandas.
Une histoire d'essayer pyenv, virtualenv et virtualenvwrapper
L'histoire de la création d'un réseau neuronal de génération musicale
Étapes pour calculer la probabilité d'une distribution normale
Une histoire sur le changement du nom principal de BlueZ
Le problème Zip 4 Gbyte est une histoire du passé
Une histoire qui a analysé la livraison de Nico Nama.
L'histoire de vouloir acheter une aventure en forme de bague