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