ジョブ設計についてのあれやこれや

0
wyukawa @wyukawa

ジョブ管理面倒だな。基本的には前回ジョブが失敗しても次回ジョブは気にせず実行したい。そうすれば前日データはみれなくても当日データは見れるとかにになるし、そうしたほうが良いケースはあると思う。ただし前日のデータをもとにしている場合(例:累積合計とか新規ユーザ)はそうもいかない。

2014-08-26 13:14:07
wyukawa @wyukawa

その場合でも一連のジョブネットのうちそのようなジョブは一部だけというケースがほとんどなので、ジョブネット自体は前回ジョブが失敗しても次回ジョブは実行するようにして個々のジョブ内でバリデーションを追加するのがいいかな

2014-08-26 13:14:22
Sadayuki Furuhashi @frsyuki

@wyukawa それ難しいですよねぇ。a)以前のクエリ結果に関わらず毎日クエリを実行する方法、b)クエリ結果の最後の成功時点〜今日までの結果を毎日集計する方法があると思っていて、後者は色々と蜜月号になるので前者の方が実装は簡単なんですが、前日の結果に依存するクエリは難しい。

2014-08-26 13:25:46
Sadayuki Furuhashi @frsyuki

@wyukawa 前日の結果に依存する場合は、1)毎日2,3日分の結果を連続して集計するようにしておき、1,2日分が失敗しても翌日に自動的に再集計されるようにする、2)もう諦めて毎日全データをなめる、3)クエリが失敗したらアラートが上がるようにして手動で直す…あたりがありますが、

2014-08-26 13:27:24
Sadayuki Furuhashi @frsyuki

@wyukawa 1),2)はリソースを無駄に消費するし、SQLが複雑になるし、とはいえ3)だと手動操作が増えるのでイケてないですよねぇ…

2014-08-26 13:28:05
wyukawa @wyukawa

@frsyuki なるほど、なるほど。参考になります。ありがとうございます。3)以外は思いつかなかったのですが、いろいろやり方はありますね。ただ1),2)も難しいですね。。。部分的に適用するのはありかもですが。

2014-08-26 13:32:05
Sadayuki Furuhashi @frsyuki

@wyukawa a+2はやはり簡単で、データ量が多くなるとどうしてもa+3、気合いの入ったケースだとa+1もあり、pull型の中間DBとの接続する場合はb…と使い分ける必要がありそうです。TDの内部ジョブで、特に毎日でなく毎時なスケジュールだとa+1までがんばるケースが多い。

2014-08-26 13:41:44
wyukawa @wyukawa

@frsyuki ほむほむ。是非その知見をブログに書いてくださいw

2014-08-26 13:48:05
Sadayuki Furuhashi @frsyuki

@wyukawa ほむほむ。TODOにしておきます。a+1はカレンダーテーブルを作ってJOINするなどすればいいのですが、まぁ大変ではあります…

2014-08-26 13:49:05
wyukawa @wyukawa

@frsyuki カレンダーテーブルが出てくる時点でなんか複雑そうw

2014-08-26 13:59:37
wyukawa @wyukawa

例えば8/1からデータ収集を開始したとして、8/2にジョブ実行して8/1のデータを集計するというパターンを考える。8/3に8/1と8/2の分のクエリを2回実行する、8/4にクエリを3回実行する、、、、期間長くなると厳しそうだな。。。

2014-08-26 14:03:00
wyukawa @wyukawa

かりに全データをなめるパターン、例えば8/4は8/1-8/3分のデータを対象にクエリ1回実行、8/5は8/1-8/4分のデータを対象にクエリ1回実行、、、にしてもそんなに性能は変わらないような気がするけど、どうだろう。

2014-08-26 14:04:51
wyukawa @wyukawa

そうするとやはりカレンダーテーブルつくって直近2,3日分を対象にするとかになるけど、そうするとおそらくクエリが複雑になると

2014-08-26 14:05:12