Airflow 紹介#
Apache Airflow™ は、バッチワークフローの開発、スケジューリング、モニタリングに使用されるオープンソースプラットフォームです。Airflow の拡張可能な Python フレームワークを使用すると、ほぼすべてのテクノロジーに接続できるワークフローを構築できます。Web インターフェースはワークフローの状態を管理するのに役立ちます。Airflow は、ノートブック上の単一のプロセスから最大のワークフローをサポートする分散設定まで、さまざまな方法で展開できます。
実現目標#
独自のメール ETL プロジェクトと組み合わせて、ワークフローのスケジューリングを Airflow に委任し、ビジネスプロジェクト自体の仮想環境に Airflow をインストールする方法を採用します。これは比較的簡単な方法であり、通常は 2 つを切り離すべきですが、このプロジェクトでは目的が単純で、ワークフローの数も少ないため、現在のビジネスプロジェクトのみにサービスを提供します。将来的に Airflow を使用する他のプロジェクトがある場合は、切り離しの問題を考慮する必要があります。
インストール手順#
export AIRFLOW_HOME=/プロジェクトディレクトリ/airflow
AIRFLOW_HOME というシステム変数を指定し、現在のプロジェクトディレクトリの下に airflow フォルダを作成します。これにより、airflow の設定ファイル、ログフォルダ、dag フォルダ、プラグインフォルダ、sqlite データベースファイルが現在のプロジェクトディレクトリに配置されます。そうしないと、airflow は自動的に /home ディレクトリにフォルダを作成します。
AIRFLOW_VERSION=2.7.3
# インストールしているPythonのバージョンを抽出します。AirflowでサポートされていないPythonバージョンを使用している場合は、手動で設定することを検討してください。
# サポートされているバージョンについては、上記を参照してください。
PYTHON_VERSION="$(python --version | cut -d " " -f 2 | cut -d "." -f 1-2)"
CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt"
# 例えば、これはPython 3.8で2.7.3をインストールします:https://raw.githubusercontent.com/apache/airflow/constraints-2.7.3/constraints-3.8.txt
pip install "apache-airflow==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}"
仮想環境をアクティブにした後(source ./env/bin/activate)、上記のスクリプトを実行して Airflow の 2.7.3 バージョンをインストールします。仮想環境はホストの Python バージョンが 3.8 以上にバインドされていることが要件です。このステップでは、最初のインストール時にさまざまな依存関係の問題が発生する場合がありますが、特に現在のビジネスプロジェクトとの依存関係の問題に注意して解決してください。インストールが遅い場合は、国内のソースに置き換えることもできます -i https://pypi.mirrors.ustc.edu.cn/simple/
airflow standalone
スタンドアロンバージョンのサービスを起動します。このステップが成功すると、ほぼ半分成功したと言えますが、基本的には不可能です。最初に遭遇する問題は、sqlite のバージョンが低いという警告です。これは主に CentOS のためで、デフォルトでインストールされている sqlite3 のバージョンが 3.7 であり、Airflow が必要とする最低バージョンである 3.15 よりも低いためです。Ubuntu ではこの問題は発生しないはずです。解決策も複雑ではありません。3.15 バージョンの sqlite のコピーをインストールし、ショートカットコマンドを置き換えて再度実行します。ここで注意すべき点がありますが、通常、本番環境では sqlite の使用は推奨されていませんが、接続方法を変更するには./airflow/airflow.cfg という設定ファイルを変更する必要があります。不思議なことに、このディレクトリ、さらにはこのフォルダは、Airflow サービスを一度起動すると作成されます!以前は sqlite をアップグレードせずに直接データベース接続方法を変更しようとしましたが、システム変数が効かないと思っていましたが、ユーザーディレクトリにもありませんでした。その後、この警告を見つけるために公式ドキュメントを見ていました。したがって、sqlLite は不可欠です。将来的にはバックエンドのデータベースとして使用しない場合でもです。
sqlite3 --version
mkdir sqlite3_upgrade
cd sqlite3_upgrade
wget --no-check-certificate https://www.sqlite.org/2023/sqlite-autoconf-3440200.tar.gz
tar -xzvf sqlite-autoconf-3440200.tar.gz
cd sqlite-autoconf-3440200/
./configure
make
make install
/usr/local/bin/sqlite3 --version
cp /usr/bin/sqlite3 /usr/bin/sqlite3_old
rm /usr/bin/sqlite3
ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3
sqlite3 --version
上記は CentOS 7 で sqlite をアップグレードするための参考手順です。
3.44 が出力されると、起動できるようになります。
airflow standalone
通常、起動できるはずです。次に、プロジェクトディレクトリの airflow フォルダに対応する log フォルダ、airflow.cfg、および airflow.db が表示されます。
ブラウザでマシンの IP アドレス + ポート番号 8080 を入力すると、Web ページにアクセスできます。デフォルトのユーザー名:admin、デフォルトのパスワードはバックグラウンドログおよび airflow フォルダの standalone_admin_password.txt ファイルにあります。
次に、sqlite を mysql に置き換えます(PostgreSQL の場合は、Airflow に組み込まれたプラグインとのやり取りがより簡単です)。設定ファイルのパラメータを次のように変更します:
sql_alchemy_conn = mysql+pymysql://username:password@host:port/db_name
公式ドキュメントで推奨されているものに注意してください:
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
CentOS では問題が発生する場合があります。mysqlclient ドライバがインストールできないか、バージョンが一致しない場合があります。最終的に私はインストールしましたが、まだ効果がありませんでしたので、Python の mysql ドライバに変更しました。mysqlclient は Airflow の公式 CI で検証されているにもかかわらずです。おそらく Ubuntu または他のシステムでは問題がないでしょう。
注:公式のものを使用しても問題ありません。システムバージョンに合ったもの(CentOS 7)mariadb-devel をダウンロードしてインストールするだけです。
保存後、次を実行します:
airflow db migrate
システムは必要なデータベースを指定した mysql サーバーに自動的に移行します。予期しないエラーが発生する場合は、Airflow がテーブルを作成する際に「updated_at」のデフォルト値が無効であるというエラーメッセージが表示されます。これはおそらく mysql のデフォルトの日付形式の問題です。mysql は現在厳密なモードで実行されているため、「SET SQL_MODE='ALLOW_INVALID_DATES';」というコマンドを実行して mysql のモードを変更する必要があります。ただし、これは一時的な解決策であり、最終的には mysql の設定ファイル(my.ini)を変更して「NO_ZERO_DATE」を sql-mode オプションから削除し、再起動する必要があります。ただし、mysql は Docker でデプロイされており、Docker 内では vim コマンドを使用できません... この問題はまだ未解決です。
最後に:
airflow db migrate
airflow standalone
mysql データベースに多くのテーブルが追加され、システムは正常に Web 経由でアクセスできるようになりました!
未解決の問題#
- mysql の設定ファイルの永続的な変更
- sqlLite の永続的な変更後の問題
- 本番環境のデプロイモードは現在のものとは異なるはずです