気流はランダムにキューに入れられたタスクを実行していません。一部のタスクはキューに入れられたステータスさえ取得しません。スケジューラのログで以下を見続けます
[2018-02-28 02:24:58,780] {jobs.py:1077} INFO - No tasks to consider for execution.
データベースには、ステータスがないか、キューに登録されたステータスのタスクが表示されますが、開始されません。
気流のセットアップは、Redisを使用したECSで https://github.com/puckel/docker-airflow を実行しています。 4つのスケジューラスレッドと4つのCeleryワーカータスクがあります。実行されていないタスクの場合、タスクアイコンにマウスポインターを合わせるとnullになり、タスクの詳細は次のように表示され、キュー状態(灰色のアイコン)で表示されます。
All dependencies are met but the task instance is not running. In most cases this just means that the task will probably be scheduled soon unless:- The scheduler is down or under heavy load
スケジューラーのメトリックは、大きな負荷を示しません。 DAGは非常にシンプルで、2つの独立したタスクが最後の実行にのみ依存しています。同じdagには、ステータスなしでスタックしているタスクもあります(白いアイコン)。
注目すべき興味深いことは、スケジューラーを再起動すると、タスクが実行状態に変わることです
気流の設定は少し難しい場合があります。
airflow scheduler
を実行していますか?airflow webserver
を実行していますか?たとえば、誤ってdepends_on_past: True
に設定されたDAGがあり、現在のインスタンスが正しく起動することを禁止しています。
また、ドキュメントに直接記載されている優れたリソースには、さらにいくつかのヒントがあります。 タスクがスケジュールされないのはなぜですか? 。
私はpuckel/docker-airflowレポジトリのフォークも実行していますが、ほとんどがAirflow 1.8で約1年間、1000万以上のタスクインスタンスを使用しています。この問題は1.9でも続いていると思いますが、私は前向きではありません。
何らかの理由で、Airflowスケジューラには、時間の経過とともにパフォーマンスが低下するという長年の問題があるようです。スケジューラのコードを確認しましたが、通常のスケジュールに戻すために新たに開始したときの正確な相違点についてはまだわかりません。大きな違いの1つは、スケジュールされたタスクとキューに入れられたタスクの状態が再構築されることです。
Scheduler Basics Airflow wikiには、スケジューラーの仕組みとそのさまざまな状態に関する簡潔なリファレンスがあります。
ほとんどの人は、スケジューラを定期的に再起動することで、スケジューラのスループットの問題を解決します。個人的には1時間間隔で成功しましたが、5〜10分ごとに使用されることも頻繁にあります。タスクの量、タスクの期間、および並列処理の設定は、再起動間隔を試すときに考慮する価値があります。
詳細については、以下を参照してください。
これは SCHEDULER_RUNS
config設定 を使用してすべてのX実行を再起動することで対処されていましたが、その設定はデフォルトのsystemdスクリプトから 最近削除されました でした。
Airflow devメーリングリスト への投稿を検討することもできます。私はこれが数回そこで議論されたことを知っています、そして、コア貢献者の1人は追加の文脈を提供できるかもしれません。
関連する質問
私は今日問題に直面しており、tobi6以下の回答からの箇条書き4が解決し、問題を解決したことがわかりました
*'Do all the DAGs you want to run have a start date which is in the past?'*
エアフローバージョンv1.10.3を使用しています
私の問題はさらに一歩先にあり、タスクがキューに入っていることに加えて、Flower UIでセロリ労働者を見ることができませんでした。解決策は、セロリワーカーをルートとして実行していたため、〜/ .bashrcファイルを変更する必要があったということでした。
次の手順で機能しました。
Http:// {Host}:5555でFlower UIを確認してください
これはセロリバージョン4.2.1とredis 3.0.1の問題で、ここで説明しているように思えます。
https://github.com/celery/celery/issues/3808
redisバージョン2.10.6をダウングレードすることで問題を解決しました。
redis==2.10.6
もう1つ確認する必要があるのは、「DAGの同時実行パラメーターに達しましたか?」です。
いくつかのタスクがNO STATUSと表示されたときに同じ状況を経験しました。
File_Sensorタスクは、timeoutを1週間に設定して実行されましたが、DAGのタイムアウトはわずか5時間でした。そのため、ファイルが欠落しており、タスクを実行している多くのセンサーが同時に実行されていました。結果はconcurrencyオーバーロードです!
センサータスクが成功する前に依存タスクを開始できませんでした。DAGがタイムアウトすると、NO STATUSになりました。
私の解決策:
ドキュメントを参照してください。 https://airflow.Apache.org/faq.html#why-isn-t-my-task-getting-scheduled
私も同様の問題を抱えていましたが、それは主に合計で3000を超えるタスクインスタンス(30タスク* 44サブダグタスク)を持つSubDagOperatorに関連しています。
私が見つけたのは、airflow scheduler
が主にスケジュールされたタスクを「キュースロット」(プール)に入れる役割を果たし、airflow celery workers
がキューに入れられたタスクをピックアップし、[使用済み]スロット」(プール)を実行します。
説明に基づいて、scheduler
は正常に機能するはずです。 「セロリワーカー」のログをチェックしてエラーがあるかどうかを確認するか、再起動して問題が解決するかどうかを確認することをお勧めします。セロリ労働者は通常、数分間ストライキを行ってから再び作業を開始するという問題をいくつか経験しました(特にSubDagOperatorで)