web-dev-qa-db-ja.com

airflow trigger_dag execution_dateが翌日ですが、なぜですか?

最近、私は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:002016-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
17
Jiacai Liu

最初に、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_date2016-01-01で実行すると、真夜中の2016-01-02の直後にトリガーされます。

この左向きのラベル付けは、ETLと差分負荷の観点から考えると非常に理にかなっていますが、単純なcronのようなスケジューラーの観点から考えると混乱します。

33
mistercrunch

エアフローはUTCで時間を提供します。タスクを実行しているタイムゾーンがわかりません。したがって、UTCタイムゾーンを考慮し、それに応じてジョブをスケジュールまたはトリガーするようにしてください。

トリガーする時間をUTC時間に変換して、DAGをトリガーしてください。できます。詳細については、以下のリンクをご覧ください。

https://cwiki.Apache.org/confluence/display/AIRFLOW/Common+Pitfalls

1
vijay krishna