私はDocker Apache airflow VERSION 1.9.0-2( https://github.com/puckel/docker-airflow )を使用しています。
スケジューラは大量のログを生成し、ファイルシステムはすぐに領域を使い果たすので、(/ usr/local/airflow/logs/schedulerのスケジューラコンテナにあるairflowによって作成されたスケジューラログをプログラムで削除しようとしています)
これらのメンテナンスタスクをすべて設定しました: https://github.com/teamclairvoyant/airflow-maintenance-dags
ただし、これらのタスクはワーカーのログのみを削除し、スケジューラログはスケジューラコンテナにあります。
リモートロギングもセットアップして、ログをS3に送信しますが、これに言及しているように、SO post Removeing Airflow task logs このセットアップでは、Airflowがローカルに書き込むのを停止しません機械。
さらに、ここで概説するように、ワーカーとスケジューラの間で共有の名前付きボリュームを作成しようとしました Docker Compose-複数のコンテナ間で名前付きボリュームを共有する 。ただし、ワーカーで次のエラーが発生します。
ValueError: Unable to configure handler 'file.processor': [Errno 13] Permission denied: '/usr/local/airflow/logs/scheduler'
スケジューラの次のエラー:
ValueError: Unable to configure handler 'file.processor': [Errno 13] Permission denied: '/usr/local/airflow/logs/scheduler/2018-04-11'
では、どうすればスケジューラログを削除できますか?
this の返信に触発されて、私は here からairflow-log-cleanup.py
DAG(パラメータにいくつかの変更を加えたもの)を追加して、allを削除しましたスケジューラログを含む古いエアフローログ。
EC2のディスクサイズ(/dev/xvda1
の7.7G)を考慮すると、マイナーな変更はマイナーですが、DEFAULT_MAX_LOG_AGE_IN_DAYS
の30日間のデフォルト値は大きすぎるように見えたため(4つのDAGがありました)、14日間に変更しましたが、環境:
DEFAULT_MAX_LOG_AGE_IN_DAYS = Variable.get("max_log_age_in_days", 30)
がDEFAULT_MAX_LOG_AGE_IN_DAYS = Variable.get("max_log_age_in_days", 14)
に変更されました
以下は、この問題を解決するための1つのオプションです。
次のメカニズムを使用して、Dockerコンテナーにログインします
#>docker exec -it <name-or-id-of-container> sh
上記のコマンドの実行中に、コンテナが実行されていることを確認してください。
次に、cronジョブを使用して、これらのログファイルにスケジュールされたrmコマンドを構成します。
「Airflowタスクログの削除」に対するこの回答 は、Airflow 1.10のユースケースにも適合します。
基本的に、カスタムログハンドラーを実装し、デフォルトの代わりにそのハンドラーを使用するようにAirflowロギングを構成する必要があります(UPDATING.md
、notREADME
もドキュメントも!!、Airflowソースリポジトリ内)
注意事項:ロギング、マルチプロセッシング、およびAirflowのデフォルトハンドラーの相互作用により、派生ハンドラークラスでsuper()を呼び出してハンドラーメソッドを拡張するよりも、ハンドラーメソッドをオーバーライドする方が安全です。 Airflowのデフォルトハンドラーはロックを使用しないため