メインコンテンツまでスキップ

データ配布コンセプト

Dorisでは、データ分散の中核は、テーブルに書き込まれるデータ行を、合理的なパーティショニングおよびバケッティング戦略を通じて、基盤となるストレージのさまざまなデータシャード(Tablet)に効率的にマッピングすることです。データ分散戦略により、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戦略を有効にして、同じバケッティング列値を持つデータを同じ物理ノードに配置し、ノード間でのデータ転送を削減して、クエリパフォーマンスを大幅に向上させることができます。

パーティション Pruning

クエリ中、Dorisはフィルタリング条件を通じて無関係なパーティションをプルーニングし、それによってデータスキャン範囲を削減し、I/Oコストを削減できます。

Bucketing Parallelism

クエリ中、適切なバケット数により、マシンの計算およびI/Oリソースを最大限に活用できます。


データ分散の目標

  1. 均等なデータ分散 すべてのBEノード間でデータが均等に分散されることを確保し、特定のノードに過負荷をかけるデータスキューを避けることで、システム全体のパフォーマンスを向上させます。

  2. クエリパフォーマンスの最適化 適切なパーティションプルーニングによりスキャンデータ量を大幅に削減し、適切なバケット数により計算並列性を向上させ、COLOCATEの効果的な使用によりShuffleコストを削減し、JOINおよび集計クエリの効率を向上させます。

  3. 柔軟なデータ管理

    • 時間ベースのパーティショニングによるコールドデータ(HDD)とホットデータ(SSD)のストレージ。
    • 履歴パーティションを定期的に削除してストレージスペースを解放。
  4. メタデータ規模の制御 各シャードのメタデータはFEとBEの両方に保存されるため、シャード数を適切に制御する必要があります。経験的な推奨事項:

    • 1000万シャードごとに、FEには少なくとも100GBのメモリが必要です。
    • 単一のBEが処理するシャード数は20,000未満にする必要があります。
  5. 書き込みスループットの最適化

    • バケット数を適切に制御(推奨 < 128)して、書き込みパフォーマンスの劣化を避ける。
    • 一度に書き込むパーティション数を適切にする(一度に少数のパーティションを書き込むことを推奨)。

パーティショニングおよびバケッティング戦略を慎重に設計・管理することで、Dorisは大規模データのストレージとクエリ処理を効率的にサポートし、さまざまな複雑なビジネスニーズを満たすことができます。