最近、私はexecution_date
の実行時にairflow trigger_dag <my-dag>
で1つの問題が発生するほどの気流をテストしました。
execution_date
は、最初は here から私たちが最初に考えるものではないことを学びました:
Airflowは、ETLニーズのソリューションとして開発されました。 ETLの世界では、通常、データを要約します。したがって、2016年2月19日のデータを要約したい場合は、2016年2月20日のグリニッジ標準時(2016年2月19日のすべてのデータが利用可能になった直後)に集計します。
start_date = datetime.combine(datetime.today(),
datetime.min.time())
args = {
"owner": "xigua",
"start_date": start_date
}
dag = DAG(dag_id="hadoopprojects", default_args=args,
schedule_interval=timedelta(days=1))
wait_5m = ops.TimeDeltaSensor(task_id="wait_5m",
dag=dag,
delta=timedelta(minutes=5))
上記のコードは私の毎日のワークフローの開始部分です。最初のタスクは、実際の作業の前にさらに5分間待機するTimeDeltaSensorです。つまり、2016-09-09T00:05:00
、2016-09-10T00:05:00
...などでDAGがトリガーされます。 。
Web UIでは、scheduled__2016-09-20T00:00:00
のようなものが表示され、2016-09-21T00:00:00
でタスクが実行されます。これは、ETL
モデルによれば妥当なようです。
しかし、いつの日か不明な理由でDAGがトリガーされないので、手動でトリガーします。2016-09-20T00:10:00
でトリガーすると、TimeDeltaSensorは2016-09-21T00:15:00
まで待機してから実行されます。
これは私が望むものではありません。翌日ではなく2016-09-20T00:15:00
で実行したいのですが、execution_date
から--conf '{"execution_date": "2016-09-20"}'
を渡してみましたが、機能しません。
この問題にどのように対処すればよいですか?
$ airflow version
[2016-09-21 17:26:33,654] {__init__.py:36} INFO - Using executor LocalExecutor
____________ _____________
____ |__( )_________ __/__ /________ __
____ /| |_ /__ ___/_ /_ __ /_ __ \_ | /| / /
___ ___ | / _ / _ __/ _ / / /_/ /_ |/ |/ /
_/_/ |_/_/ /_/ /_/ /_/ \____/____/|__/
v1.7.1.3
最初に、start_date
には定数を使用することをお勧めします。これは、動的な定数が予期せずに動作するため、エアフローパイプラインがスケジューラによって評価されるためです。
start_date
の詳細については、FAQエントリをここに記述し、これをすべて整理します: https://airflow.Apache.org/faq.html#what -s-the-deal-with-start-date
さて、execution_date
について、そしてそれがトリガーされたとき、これはAirflowでオンボーディングしている人々にとって一般的な問題です。 Airflowはexecution_date
を、それが発生するタイミング(期間の右側の境界)に基づくのではなく、カバーするスケジュール期間の左側の境界に基づいて設定します。たとえばschedule='@hourly'
タスクを実行すると、タスクは1時間ごとに起動します。午後2時に実行されるタスクは、午後2時に午後1時から午後2時までの時間枠を処理していると想定するため、execution_date
は午後1時になります。同様に、毎日のジョブを実行する場合、execution_date
を2016-01-01
で実行すると、真夜中の2016-01-02
の直後にトリガーされます。
この左向きのラベル付けは、ETLと差分負荷の観点から考えると非常に理にかなっていますが、単純なcronのようなスケジューラーの観点から考えると混乱します。
エアフローはUTCで時間を提供します。タスクを実行しているタイムゾーンがわかりません。したがって、UTCタイムゾーンを考慮し、それに応じてジョブをスケジュールまたはトリガーするようにしてください。
トリガーする時間をUTC時間に変換して、DAGをトリガーしてください。できます。詳細については、以下のリンクをご覧ください。
https://cwiki.Apache.org/confluence/display/AIRFLOW/Common+Pitfalls