本文へスキップ
martechfarmDATA & TECHNOLOGY DOCS

すべての記事のタイトル・本文を検索

すべての記事

127 件

タイトルを選ぶと本文が開きます

F2転換を改善する方法|2回目割引に頼らないCRM施策設計

再帰CTEの使い方|SQLでカレンダーと階層構造を生成する方法

PIVOT・UNPIVOTをSQLで実装する方法|CASE WHENで縦横変換する

勇者は最初から勇者ではない|未経験からキャリアを育てる転職論

SQLウィンドウ関数の使い方|分析クエリで必須のOVER句を理解する

ファーストパーティデータとは何か|誤解されやすい意味とCDP活用の本質

Treasure Data導入で失敗する会社の共通点|CDPを使いこなせない5つの理由

ROLLUP・CUBEで小計と総計をSQL集計する方法

EXCEPT・INTERSECTで顧客セグメント差分を抽出するSQL

パーソナライゼーションが気持ち悪い理由|顧客体験を壊さないデータ活用

中小企業がデータ活用で大企業に勝つ方法|小さな会社のCDP戦略

データエンジニアは10年後も必要か|AI時代に残る仕事と変わる役割

Treasure Dataが選ばれる理由|CDP導入で評価される強みと実務メリット

価格改定履歴をSQLで扱う方法|注文時点の正しい単価を取得するクエリ

マーケターがSQLを学ぶべき理由|2030年に必要なデータ分析スキル

ポイント残高をSQLで再計算する方法|トランザクションログから正しい残高を出す

SCDをSQLで実装する方法|履歴を保持するディメンション設計

SQLを学ぶべき理由|マーケターとデータ人材に必要な共通言語

最新レコードをSQLで取得する方法|ROW_NUMBERとDELETE INSERTの使い分け

Digdagのparallel設定を最適化する方法|夜間バッチを高速化する実務設計

セッションIDなしのアクセスログをSQLでセッション化する方法

曜日・時間帯別の売上をSQLで集計する方法|注文集中時間を可視化する

F2転換をSQLで分析する方法|初回から2回目購買までのカテゴリ経路を見る

購買間隔をSQLで分析する方法|次回購入タイミングを予測するクエリ

本文
記事一覧へ ↑

Digdagのparallel設定を最適化する方法|夜間バッチを高速化する実務設計

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〜51時間(クエリ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 に変えて実行時間を比較してみてください。劇的に改善する可能性があります。


MarTech Farmをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む