🕌

【初心者向け】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