22

最近、私はエアフローを非常に多くテストしましたがexecution_date、実行時に1 つの問題がありましたairflow trigger_dag <my-dag>

ここexecution_dateから、私たちが最初に考えることではないことを学びました:

Airflow は、ETL ニーズのソリューションとして開発されました。ETL の世界では、通常、データを要約します。したがって、2016 年 2 月 19 日のデータを要約したい場合は、2016 年 2 月 20 日午前 0 時 GMT に行います。これは、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 です。つまり、これは、私の DAG が でトリガーされることを意味し2016-09-09T00:05:00ます2016-09-10T00:05:00

Web UI では、 のようなものが表示され、scheduled__2016-09-20T00:00:00タスクは で実行されます。これは、モデル2016-09-21T00:00:00によると妥当と思われます。ETL

2016-09-20T00:10:00ただし、ある日、私の DAGは不明な理由でトリガーされないので、手動でトリガーし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
4

2 に答える 2

54

まず、 に定数を使用することをお勧めします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 時に起動するタスクはexecution_date、午後 1 時から午後 2 時までの時間枠を午後 2 時に処理していると想定しているため、午後 1 時になります。同様に、毎日のジョブを実行する場合、 の実行は のexecution_date真夜中の2016-01-01直後にトリガーされ2016-01-02ます。

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

于 2016-09-21T15:34:49.627 に答える