luigi と格闘中
背景
luigi と airflow と make を比較している。
luigi と格闘中
big query のクエリを書き換えたので再実行
あれ? 再実行されない。
ズバリな記事が見つかる。
なるほど…。というか、removing all intermediate and final outputs
って…。
downstream のすべての出力を調べて削除しないといけないわけだよ。それが面倒だから、こういったツールを使っているのに。
ちなみに、make で touch 作戦でチマチマ依存関係書いていく作戦だと、依存関係のあるターゲットは全て実行され更新される。
一つの解決策としては、 upstream の依存ファイルのハッシュ値みたいなものをパラメータとして持たせる方法が考えられる。 パラメータが変われば、別のタスクとして見なされるので再実行される(はず。luigji も詳しくないのでよくわからないが) downstream では upstream の全ての依存ファイルのハッシュ値をパラメータとして渡す必要があるが、各クラスの依存ファイルが何であるかを示すような interface を持ち、かつ upstreamの全ての依存ファイルのハッシュ値を取得しパラメータとして自動的に渡す関数を実装した task class を使うことにすれば解決するかもしれない。 誰かそういうの作っていないかな…(自分で作れよ)。いやもっとマシな解決策があるのかもしれないが…
もうちょっと調べると、complete
を再実装した例が見つかった。
こちらは 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日もずれてるだろ。
以下に書いてあった。
days_back
今日から何日前まで遡れるか、を決めているらしい。無限に過去に遡ったりするのを防止するために。
デフォルトは100ということで、それにひかかっただけの模様。ちなみに、stop の方は、exclusive だそうで、その日を含まない、ということを意味する。
stop でその日を含まないって、誰得なんだろうか。backfill としてはその日(特に当日)を含むと色々まずいのかな…。