2016-09-21 32 views
5

最近、私がテストした気流airflow trigger_dag <my-dag>を実行しているときにexecution_dateで一つの問題を持っていることそんなに。エアフローtrigger_dag execution_dateは翌日ですか?

私はexecution_dateたちはhereから初めてで考えるものではないことを学んだ:

エアフローがETLのニーズのためのソリューションとして開発されました。 ETLの世界では、通常 というデータを集計します。私は 2016年2月19日のデータを集計するのであれば、私は2016年2月19日のために、すべてのデータが利用可能になった後 右されるであろう、2016年2月20日深夜GMTでそれを行うだろう。コードの上

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:002016-09-10T00:05:00でトリガーされることを意味します...

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

私のダグは未知の理由でトリガーされないので、手動で起動します。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 

答えて

10

まず動的なものがあなたの気流パイプラインは、スケジューラによって評価されて基づいて予測不可能に作用するので、私は、あなたがstart_dateの定数を使用してお勧めします。

詳しい情報についてstart_dateここで私が書いたとソートすべて、このうちFAQ項目内:今すぐ http://pythonhosted.org/airflow/faq.html#what-s-the-deal-with-start-date

を、およそexecution_dateと、それがトリガされたとき、これはエアフローにオンボーディング人々のための共通の落とし穴です。気流は、それが発生したときに基づいているのではなく、それがカバーしているスケジュール期間の左境界に基づいてexecution_dateを設定します(これは、期間の右境界になります)。たとえば、schedule='@hourly'タスクを実行すると、タスクは1時間ごとに起動します。午後2時に発生するタスクは、午後2時に午後1時から午後2時までの時間ウィンドウを処理していることを前提としているため、午後2時に発生するタスクはexecution_dateになります。あなたは、毎日の仕事を実行した場合も同様に、2016-01-02に真夜中の後にすぐにトリガし2016-01-01execution_dateで実行します。

この左結合した標識は、ETLおよび差動負荷の観点で考えると多くの意味になりますが、シンプル、cronのようなスケジューラの観点で考えると混乱を取得します。

+0

下のリンクを読むことができます、私はその日の真夜中に私の' start_date'を丸めhaved、私の問題は、 'execute_dateですダグが外部から誘発された翌日に設定されているので、上記のように不合理だと思う。 –

+0

私はスケジュールのETLスタイルを理解していますが、私は問題を解決することができます:不明な理由で、私のダグがトリガされていない、 'trigger_dag'サブコマンドの他に' execution_date' 'この場合、なぜ' trigger_dag'が必要なのでしょうか?ナンセンスですか? –

+0

スケジューラを実行していますか? 'airflow scheduler' – mistercrunch

1

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

トリガーする時間をUTC時間に変換し、DAGをトリガーしてみてください。できます。詳細については、私はそれが `start_date`問題だとは思わない

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

関連する問題