Treasure Data の ワークフローエンジン「Digdag」には、複数のタスクを並列実行できる _parallel オプションがあります。
夜間バッチで30本ものクエリを回すとき、「とりあえず5にしておこう」「Prestoの同時実行数が5だから合わせよう」と設定していませんか?
実はその判断、処理効率を大幅に落としている可能性があります。
parallel設定の正しい仕組みと、Presto・Hiveを組み合わせた最大効率バッチの作り方を解説します。
parallel設定の大きな誤解
まず前提として、_parallel の動作を正しく理解する必要があります。
よくある誤解:「parallel: 5 = 常時5個並列実行」
これは間違いです。
_parallel: 5 と設定すると、Digdag はタスクを5個ずつグループ化して実行します。
具体的には以下のように動作します。
グループ1:クエリ1, 2, 3, 4, 5 → 全て完了するまで待機
グループ2:クエリ6, 7, 8, 9, 10 → グループ1完了後に開始
グループ3:クエリ11, 12, ... → 以下同様グループ内の全タスクが完了しないと、次のグループが始まりません。
parallel: 5 の致命的な問題
30クエリを実行する夜間バッチを例に考えましょう。
クエリ4番だけが1時間かかる重いクエリだったとします。
_parallel: 5 に設定している場合、こうなります。
| グループ | クエリ | 所要時間 |
|---|---|---|
| グループ1 | クエリ1〜5 | 1時間(クエリ4が終わるまで全員待機) |
| グループ2 | クエリ6〜10 | グループ1完了後に開始 |
| … | … | … |
クエリ1, 2, 3, 5が数分で終わっても、クエリ4の1時間が終わるまでグループ全体が止まります。
次のクエリ6は、たとえ実行できる状態でも待ち続けます。これが parallel 設定の罠です。
解決策:parallel: 100 にする
30クエリを実行したいなら、_parallel: 100 など実行クエリ数より大きな値を設定してください。
この場合の動作はこうなります。
全30クエリが一斉にキューへ投入
↓
Prestoの同時実行上限(例:5)まで即座に実行スタート
↓
実行が完了したクエリの分だけ、キュー待ちのクエリが順次開始先ほどのシナリオで再現すると、
- クエリ4(1時間)は1時間かかるが、他のクエリはその間もどんどん進む
- クエリ2が5分で終われば、すぐにクエリ6が始まる
- クエリ4が終わり次第、残りのキューから次のクエリが流れる
遅いクエリが他の処理を止めることがなくなります。これが最大効率です。
Prestoの同時実行数はparallel設定では変わらない
ここで重要な補足があります。
Prestoの同時実行数の上限は、COMPUTE UNITS(契約プラン)によって決まります。一般的には3〜5クエリが上限です。
「じゃあ parallel: 5 にすれば無駄なくちょうどいいのでは?」と思うかもしれませんが、それは間違いです。
parallel設定はPrestoの同時実行数に影響しません。parallel設定はDigdag側のグループ管理の話であり、Prestoのキューとは独立しています。
_parallel: 100 にしても、Prestoには同時実行上限の制御があるため、上限を超えた分は自動的にQueueで待機します。過負荷にはなりません。
むしろ parallel を実行数に合わせることで、Queue管理の効率が落ち、処理が遅くなります。
ただし、Queueの上限は255だったはずなので余裕をみて100にした方が良いです。255を超えてQueueを入れるとエラーになります。
Hiveの並列実行についても同様の考え方が当てはまります。
Presto × Hive の組み合わせでさらに高速化
parallel設定の最適化に加えて、PrestoとHiveを使い分けることで処理時間をさらに大幅に削減できます。
Prestoが得意なこと
- 小〜中規模データの高速集計
- インタラクティブなリアルタイムに近い分析
- レスポンスが必要なクエリ
Hiveが得意なこと
- 大規模データのバッチ処理
- 夜間に流す重い集計・変換処理
- 時間がかかっても確実に完了させたい処理
夜間バッチでは、重いクエリはHiveに、軽いクエリはPrestoに振り分けることで、エンジンの特性を最大限に活かせます。
この使い分けと _parallel: 100+ の組み合わせで、処理時間が数分の1〜数十分の1になるケースも珍しくありません。
まとめ:Digdag parallel設定の鉄則
| 項目 | 内容 |
|---|---|
| parallel の意味 | タスクをN個ずつグループ化する設定。同時実行数の上限ではない |
| 推奨値 | 実行クエリ数より大きな値(例:30クエリなら100以上) |
| Prestoの同時実行数 | COMPUTE UNITSで決まる。parallel設定では変えられない |
| Hiveとの使い分け | 重いバッチはHive、軽い集計はPrestoで最大効率化 |
夜間バッチで「なんとなくparallel: 5」にしている方は、ぜひ一度 _parallel: 100 に変えて実行時間を比較してみてください。劇的に改善する可能性があります。