シャッフル(Shuffle)とは、分散処理においてデータをキーごとに再分配(再グループ化)する操作のことです。
複数のワーカー(処理マシン)に分散していたデータを、特定のキーに基づいて再配置し、同じキーを持つデータを同じワーカーに集める処理です。
キーごとにデータをグループ化
複数のデータセットをキーで結合
全データを集約
重複を除去
各ワーカーが保持しているデータを、キーのハッシュ値に基づいて送信先ワーカーを決定します。
送信するデータを一時的にディスク(または Shuffle Service)に書き込みます。
ワーカー間でデータを転送します。これが最もコストがかかる部分です。
受信側ワーカーがデータを受け取り、キーごとにソートして処理可能な状態にします。
グループ化されたデータに対して、次の変換処理を実行します。
| 項目 | Batch Shuffle(従来型) | Dataflow Shuffle(最適化版) |
|---|---|---|
| データの保存先 | 各ワーカーのローカルディスク | Dataflow Shuffle Service(専用サービス) |
| ワーカー間通信 | ワーカー同士が直接通信 | Shuffle Service経由で集中管理 |
| 耐障害性 | ワーカー障害時に再計算が必要 | Shuffle Service にデータが残るため再計算不要 |
| パフォーマンス | ワーカー数が増えると効率低下 | 大規模でも高効率 |
| コスト | ワーカーのCPU/メモリリソースを消費 | Shuffle Service利用料が発生(効率的) |
| スケーラビリティ | ワーカー数に限界あり | 数千ワーカーでもスケール可能 |
例:1TB のデータを GroupByKey で処理する場合
※ データの分散状況やキーの偏りによって大きく変動します
GroupByKey の前に事前集約を行い、転送データ量を削減
--experiments=shuffle_mode=service フラグで有効化
特定キーにデータが集中しないように設計
部分集約で転送データを圧縮
本当に必要か再検討する
Key-Value の Value サイズを最小限に
連続したシャッフルは極力避ける
特定キーへのデータ集中を解消
問題点: 全データをシャッフルしてから集約している
改善点: 事前集約により転送データ量を大幅削減
大崎のオフィスでDataflowパイプラインを設計する際は、シャッフルが発生する箇所を意識し、データ量が大きい場合は必ず最適化を検討しましょう!特にGCP Data Engineer試験でも頻出のテーマです。