W tym poście szerzej opowiemy o: Apache Airflow uruchamianie wielu DAGów tasków równolegle? Na początku Twojej przygody z Airflow przypuszczam, że napotkałeś sytuację, gdy tworzyłeś wiele DAG-ów z zawierających jakieś zadania i kiedy uruchamiałeś wszystkie DAG’i w tym samym czasie to zaobserwowałeś, że niezależne zadania z niezależnych DAG są uruchamiane sekwencyjnie, NIE równolegle, jak zakładałeś, że powinno być.
Apache Airflow uruchamianie wielu DAGów tasków równolegle
Powód
Jest to związane z domyślną konfiguracją Apache Airflow. W pliku konfiguracyjnym znajduje się parametr „executor”, którego domyślną wartością jest: SequentialExecutor. W kolejnych krokach pokażę, jak skonfigurować instancję Airflow tak, aby można było uruchamiać DAGi i zadania w trybie równoległym.
Airflow – Proces Instalacji
Zanim zainstalujemy Airflow, zainstaluj brakujące biblioteki dla klienta MySQL:
sudo apt-get install python3.6-dev libmysqlclient-dev
Teraz możemy zainstalować Apache Airflow z dodatkową funkcją [mysql]. Umożliwi nam to wykorzystanie bazy danych MySQL jako backend dla Airflow.
export SLUGIFY_USES_TEXT_UNIDECODE=yes && pip install apache-airflow[mysql,crypto]
Podczas standardowej instalacji uruchamiane jest polecenie, które tworzy bazę danych SQLite w katalogu AIRFLOW_HOME, która pozwala użytkownikowi rozpocząć pracę z Airflow. Oczywiście, jest to poprawny sposób. Musisz mieć jakiś punkt startowy.
# Domyślna inicjalizacja bazy danych SQLite airflow initdb
Jak skonfigurować Apache Airflow, aby uruchamiać zadania równolegle?
Najpierw musisz mieć nowe miejsce na metadane Airflow. W naszym przypadku wykorzystam bazę danych MySQL. W tym scenariuszu już zainstalowałem bazę danych MySQL na tej samej maszynie co Airflow, ale możesz oczywiście użyć innej, do której masz otwarte połączenie z hosta Airflow.
Jeśli nie masz już zainstalowanej bazy danych MySQL, zainstaluj ją za pomocą mojego samouczka: Jak zainstalować bazę danych MySQL na Ubuntu 18.04?
Utwórz użytkownika „airflow” i bazę danych w instancji MySQL
Jeśli mamy już uruchomioną bazę danych MySQL, musimy stworzyć użytkownika i bazę danych dedykowaną dla usługi Airflow. Połączmy się z MySQL. W moim przypadku użyję użytkownika root do stworzenia nowego użytkownika i bazy danych „airflow”.
mysql -u root -p
Utwórz nową bazę danych:
mysql> CREATE DATABASE airflow;
Teraz utwórz nowego użytkownika i nadaj mu wszystkie uprawnienia do bazy danych nowo utworzonej bazy danych.
-- Utwórz użytkownika "airflow" mysql> CREATE USER 'airflow'@'localhost' IDENTIFIED BY 'airflow'; -- Nadaj uprawnienia mysql> GRANT ALL PRIVILEGES ON airflow. * TO 'airflow'@'localhost'; -- Przeładuj uprawnienia mysql> FLUSH PRIVILEGES;
Zmień plik konfiguracyjny airflow.cfg
Teraz wchodzimy w główną fazę konfiguracji. Airflow używa pliku airflow.cfg, w którym określone są wszystkie parametry konfiguracyjne. Plik konfiguracyjny można znaleźć w katalogu $ AIRFLOW_HOME. Otwórzmy go i zmieńmy parametry executor, sql_alchemy_conn i fernet_key.
executor:
To własnie zmiana executor’a umożliwi nam uruchamianie zadań równolegle. Ale użycie np. LocalExecutor jest tylko możliwe, gdy użyjemy dodatkowej bazy danych, niż domyśla, np. MySQL czy Postgres.
# executor = SequentialExecutor executor = LocalExecutor
sql_alchemy_conn:
Tu definiujemy połączanie do naszej bazy danych.
# sql_alchemy_conn = sqlite:////home/pawel/airflow/airflow.db sql_alchemy_conn = mysql://airflow:airflow@localhost:3306/airflow
fernet_key:
Jeśli nie wiesz, jak utworzyć własny klucz Ferneta, wykonaj ten samouczek: Airflow: tworzenie klucza Frenet
Zastąp istniejącą wartość, używając nowej utworzonej przez Ciebie.
fernet_key = 30NkeeYthODONuaGqBNb13x_q_DSWuG6IUKpyb3t4Pc=
Jeszcze jedna konfiguracja MySQL
Apache Airflow opiera się na bardziej rygorystycznych ustawieniach SQL ANSI dla MySQL. W tym przypadku musimy określić explicit_defaults_for_timestamp = 1 w twoim pliku my.cnf w sekcji [mysqld].
Zrestartuj Airflow
Sprawdź, jaki jest bieżący PID dla Airflow-WebServer.
cat $AIRFLOW_HOME/airflow-webserver.pid 5023
Zabij aktualny proces:
sudo kill -9 {aktualny identyfikator procesu Airflow WebServer} # W moim przypadku sudo kill -9 5023
Zainicjuj nową bazę danych i zrestartuj airflow-webserver i airflow-scheduler.
-D – parametr ten uruchomi airflow-webserver i airflow-scheduler.jako działające usługi w tle.
airflow webserver -D airflow scheduler -D