データ配信の概念
Dorisでは、データ分散の中核は、合理的なパーティショニングとバケッティング戦略により、Tableに書き込まれるデータの行を、基盤となるストレージの様々な**データシャード(Tablet)**に効率的にマッピングすることです。データ分散戦略により、Dorisは複数のノードのストレージと計算能力を最大限に活用し、大規模データの効率的なストレージとクエリをサポートできます。
データ分散の概要
データ書き込み
データ書き込み時、DorisはまずTableのパーティショニング戦略に基づいて、データの行を対応するパーティションに割り当てます。次に、バケッティング戦略に従って、データの行をパーティション内の特定のシャードにさらにマッピングし、データ行のストレージ場所を決定します。
クエリ実行
クエリ実行時、Dorisのオプティマイザはパーティショニングとバケッティング戦略に基づいてデータをトリミングし、スキャン範囲の削減を最大化します。JOINや集約クエリが関わる場合、ノード間でのデータ転送(Shuffle)が発生することがあります。合理的なパーティショニングとバケッティング設計により、Shuffleを削減し、Colocate Joinを最大限に活用してクエリパフォーマンスを最適化できます。
ノードとストレージアーキテクチャ
ノードタイプ
Dorisクラスタは以下の2種類のノードで構成されます:
- FE Node(Frontend):クラスタメタデータ(Tableやシャードなど)を管理し、SQLの解析と実行計画の作成を担当します。
- BE Node(Backend):データを保存し、計算タスクの実行を担当します。BEからの結果はFEに集約されて返され、FEがユーザーに結果を返します。
データシャード(Tablet)
BEノードに保存されるデータはシャードに分割され、各シャードはDorisにおけるデータ管理の最小単位であり、データの移動とレプリケーションの基本単位です。
パーティショニング戦略
パーティショニングは、データ構成の最初の論理分割層であり、Table内のデータをより小さなサブセットに分割するために使用されます。Dorisは以下の2つのパーティションタイプと3つのパーティションモードを提供します:
パーティションタイプ
- Range Partitioning:パーティション列の値の範囲に基づいて、データ行を対応するパーティションに割り当てます。
- List Partitioning:パーティション列の特定の値に基づいて、データ行を対応するパーティションに割り当てます。
パーティションモード
- Manual Partitioning:ユーザーが手動でパーティションを作成します(例:Table作成時に指定、または
ALTER文で追加)。 - Dynamic Partitioning:システムが時間スケジューリングルールに基づいて自動的にパーティションを作成しますが、データ書き込み時にオンデマンドでパーティションを作成しません。
- Automatic Partitioning:システムがデータ書き込み時に必要に応じて対応するパーティションを自動的に作成しますが、ダーティデータで多数のパーティションが生成されないよう注意が必要です。
バケッティング戦略
バケッティングは、データ構成の第2の論理分割層であり、パーティション内でデータ行をより小さな単位にさらに分割するために使用されます。Dorisは以下の2つのバケッティング方法をサポートします:
- Hash Bucketing:バケッティング列の
crc32ハッシュ値を計算し、バケット数で剰余を取ることで、データ行をシャードに均等に分散させます。 - Random Bucketing:データ行をランダムにシャードに割り当てます。Random bucketingを使用する場合、小規模データの高速書き込みを最適化するために
load_to_single_tabletオプションを使用できます。
データ分散の最適化
Colocate Join
JOINや集約クエリを頻繁に必要とする大きなTableに対しては、Colocate戦略を有効にして、同じバケッティング列の値を持つデータを同じ物理ノードに配置し、ノード間でのデータ転送を削減してクエリパフォーマンスを大幅に向上させることができます。
パーティション Pruning
クエリ時、Dorisはフィルタ条件により無関係なパーティションをプルーニングし、データスキャン範囲を削減してI/Oコストを下げることができます。
Bucketing Parallelism
クエリ時、合理的なバケット数により、マシンの計算とI/Oリソースを最大限に活用できます。
データ分散の目標
-
均等なデータ分散 データがすべてのBEノードに均等に分散されることを保証し、特定のノードに過負荷をかけるデータスキューを回避し、システム全体のパフォーマンスを向上させます。
-
クエリパフォーマンスの最適化 合理的なパーティションプルーニングによりスキャンするデータ量を大幅に削減し、合理的なバケット数により計算の並列性を向上させ、COLOCATEの効果的な使用によりShuffleコストを下げ、JOINと集約クエリの効率を向上させます。
-
柔軟なデータ管理
- 時間ベースのパーティショニングによるコールドデータ(HDD)とホットデータ(SSD)の保存。
- 履歴パーティションの定期削除によるストレージスペースの解放。
-
メタデータスケールの制御 各シャードのメタデータはFEとBEの両方に保存されるため、シャード数を合理的に制御する必要があります。経験的な推奨事項は以下の通りです:
- 1000万シャードごとに、FEには少なくとも100GBのメモリが必要です。
- 単一のBEが処理するシャード数は20,000未満にする必要があります。
-
書き込みスループットの最適化
- バケット数を合理的に制御し(推奨 < 128)、書き込みパフォーマンスの劣化を回避します。
- 一度に書き込むパーティション数を適切にします(一度に少数のパーティションを書き込むことを推奨)。
パーティショニングとバケッティング戦略を慎重に設計・管理することで、Dorisは大規模データのストレージとクエリ処理を効率的にサポートし、様々な複雑なビジネスニーズを満たすことができます。