🕌
【初心者向け】Flink SQL の DISTRIBUTED BY をマスターしよう
1. Hash 分布(ハッシュ分布)
- 仕組み:指定したカラムの値をハッシュ関数で数値に変換し、分区数で割った余りで分配
- 特徴:同じキーのデータは必ず同じパーティションに行く
- 用途:キー単位で集計やJOINをする場合に最適
- 例:
DISTRIBUTED BY HASH(key) INTO 3 BUCKETS
key="A" → bucket1
key="B" → bucket2
key="A" → bucket1(必ず同じ)
2. Round-Robin 分布(ラウンドロビン分布)
- 仕組み:データを順番に全パーティションへ回しながら分配
- 特徴:均等に負荷を分散できるが、同じキーが別パーティションに行く可能性がある
- 用途:集計やJOINの必要がなく、負荷を均等化したいとき
- 例:
1行目 → bucket1
2行目 → bucket2
3行目 → bucket3
4行目 → bucket1(繰り返し)
3. Broadcast 分布(ブロードキャスト分布)
- 仕組み:全てのデータを全パーティションに複製して送る
- 特徴:全ノードで同じデータを持てるが、データ量が増える
- 用途:小規模なマスターデータを全ワーカーに配る(JOIN用)
- 例:
1行目 → 全てのbucketに送信
4. Single 分布(単一分布)
- 仕組み:全てのデータを1つのパーティションに送る
- 特徴:並列度は低いが、全データを1箇所で処理できる
- 用途:全体集計やデータ量が少ない場合
- 例:
全データ → bucket1
5. Range 分布(レンジ分布)
- 仕組み:指定したカラムの値の範囲に応じてパーティションを決める
- 特徴:近い値が同じパーティションに集まる
- 用途:範囲検索や時系列処理の最適化
- 例:
1〜100 → bucket1
101〜200 → bucket2
201〜300 → bucket3
分布戦略の比較表
分布方式 | 同じキーが同じパーティション? | 負荷均衡 | 並列度 | 主な用途 |
---|---|---|---|---|
Hash | ✅ Yes | 中 | 高 | キー集計 / JOIN |
Round-Robin | ❌ No | 高 | 高 | 均等分散 |
Broadcast | ❌ No(全コピー) | 低(複製) | 低 | 小規模マスタ配布 |
Single | ✅ 全部同じ | 低 | 低 | 全体集計 |
Range | 部分的にYes | 中 | 高 | 範囲検索 / 時系列 |
まとめ
- Hash:同じキーをまとめる
- Round-Robin:順番に均等分散
- Broadcast:全員に配る
- Single:一箇所に集める
- Range:範囲ごとに分ける
分布戦略は性能やスケーラビリティに大きく影響します。
テーブル作成時に DISTRIBUTED BY
を意識することで、Flink SQL の処理効率を最適化できます。
Discussion