中野智文のブログ

データ・マエショリストのメモ

luigi と格闘中

背景

luigi と airflow と make を比較している。

luigi と格闘中

big query のクエリを書き換えたので再実行

あれ? 再実行されない。

ズバリな記事が見つかる。

datapipelinearchitect.com

なるほど…。というか、removing all intermediate and final outputs って…。 downstream のすべての出力を調べて削除しないといけないわけだよ。それが面倒だから、こういったツールを使っているのに。 ちなみに、make で touch 作戦でチマチマ依存関係書いていく作戦だと、依存関係のあるターゲットは全て実行され更新される。

一つの解決策としては、 upstream の依存ファイルのハッシュ値みたいなものをパラメータとして持たせる方法が考えられる。 パラメータが変われば、別のタスクとして見なされるので再実行される(はず。luigji も詳しくないのでよくわからないが) downstream では upstream の全ての依存ファイルのハッシュ値をパラメータとして渡す必要があるが、各クラスの依存ファイルが何であるかを示すような interface を持ち、かつ upstreamの全ての依存ファイルのハッシュ値を取得しパラメータとして自動的に渡す関数を実装した task class を使うことにすれば解決するかもしれない。 誰かそういうの作っていないかな…(自分で作れよ)。いやもっとマシな解決策があるのかもしれないが…

もうちょっと調べると、complete を再実装した例が見つかった。

stackoverflow.com

こちらは make のように出力のタイムスタンプを見て完了かどうかを判断する。 ただし、big query とかのタイムスタンプに対応させるには、色々頑張らないといけないかもしれない。

luigi の RangeDaily

luigi の backfill コマンドとして、RangeDaily というのがあり、 start と stop で日付を指定する。

luigi --module xxx RangeDaily --of XXX   --start 2017-02-07 --stop 2017-05-17 --task-limit 100 --workers 5

こんな感じ。ところが、

DEBUG: Checking if RangeDaily(of=XXX, of_params={}, reverse=False, task_limit=100, now=None, param_name=None, start=2017-02-07, stop=2017-05-17, days_back=100, days_forward=0) is complete
DEBUG: Actually checking if range [2017-02-09, 2017-05-16] of XXX is complete

と出て、 2017-02-09 と、2017-05-16 に勝手に狭められている…。stopがその日を含まない、としても、start は2日もずれてるだろ。

以下に書いてあった。

http://luigi.readthedocs.io/en/stable/api/luigi.tools.range.html#luigi.tools.range.RangeDailyBase.days_back

days_back 今日から何日前まで遡れるか、を決めているらしい。無限に過去に遡ったりするのを防止するために。 デフォルトは100ということで、それにひかかっただけの模様。ちなみに、stop の方は、exclusive だそうで、その日を含まない、ということを意味する。 stop でその日を含まないって、誰得なんだろうか。backfill としてはその日(特に当日)を含むと色々まずいのかな…。