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

データ分散の概念

Dorisでは、データ分散の核心は、テーブルに書き込まれたデータ行を、合理的なパーティション分割とバケット分割戦略を通じて、基盤となるストレージの様々なデータシャード(Tablets)に効率的にマッピングすることです。データ分散戦略により、Dorisは複数ノードのストレージと計算能力を最大限活用し、大規模データの効率的なストレージとクエリをサポートできます。


データ分散の概要

データ書き込み

データ書き込み時、Dorisはまずテーブルのパーティション分割戦略に基づいて、データ行を対応するパーティションに割り当てます。次に、バケット分割戦略に従って、データ行をパーティション内の特定のシャードにさらにマッピングし、データ行のストレージ場所を決定します。

クエリ実行

クエリ実行時、Dorisのオプティマイザーはパーティション分割とバケット分割戦略に基づいてデータをトリムし、スキャン範囲を最大限削減します。JOINや集約クエリを含む場合、ノード間でのデータ転送(Shuffle)が発生する可能性があります。合理的なパーティション分割とバケット分割の設計により、Shuffleを削減し、Colocate Joinを最大限活用してクエリパフォーマンスを最適化できます。


ノードとストレージアーキテクチャ

ノードタイプ

Dorisクラスターは以下の2つのタイプのノードで構成されます:

  • FE Node (Frontend):クラスターメタデータ(テーブルやシャードなど)を管理し、SQLの解析と実行計画に責任を持ちます。
  • BE Node (Backend):データを格納し、計算タスクの実行に責任を持ちます。BEからの結果はFEで集約され、FEがユーザーに返します。

データシャード(Tablet)

BEノードに格納されるデータはシャードに分割され、各シャードはDorisにおけるデータ管理の最小単位であり、データ移動と複製の基本単位です。


パーティション分割戦略

パーティション分割は、データ組織の論理的分割の第一層であり、テーブル内のデータをより小さなサブセットに分割するために使用されます。Dorisは以下の2つのパーティションタイプと3つのパーティションモードを提供します:

パーティションタイプ

  • Range Partitioning:パーティションカラムの値の範囲に基づいて、データ行を対応するパーティションに割り当てます。
  • List Partitioning:パーティションカラムの特定の値に基づいて、データ行を対応するパーティションに割り当てます。

パーティションモード

  • Manual Partitioning:ユーザーが手動でパーティションを作成します(例:テーブル作成時に指定またはALTER文で追加)。
  • Dynamic Partitioning:システムが時間スケジューリング規則に基づいて自動的にパーティションを作成しますが、データ書き込み時にオンデマンドでパーティションを作成しません。
  • Automatic Partitioning:システムがデータ書き込み時に必要に応じて自動的に対応するパーティションを作成しますが、ダーティデータで過剰なパーティションが生成されないよう注意が必要です。

バケット分割戦略

バケット分割は、データ組織の論理的分割の第二層であり、パーティション内でデータ行をより小さな単位にさらに分割するために使用されます。Dorisは以下の2つのバケット分割方法をサポートします:

  • Hash Bucketing:バケットカラムのcrc32ハッシュ値を計算し、バケット数の剰余を取ることで、データ行をシャード間に均等に分散します。
  • Random Bucketing:データ行をランダムにシャードに割り当てます。Random bucketingを使用する場合、load_to_single_tabletオプションを使用して、小規模データの高速書き込みを最適化できます。

データ分散の最適化

Colocate Join

頻繁にJOINや集約クエリが必要な大きなテーブルに対しては、Colocate戦略を有効にして、同じバケットカラム値のデータを同じ物理ノードに配置し、ノード間のデータ転送を削減してクエリパフォーマンスを大幅に向上させることができます。

パーティションプルーニング

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

バケット並列性

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


データ分散の目標

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

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

  3. 柔軟なデータ管理

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

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

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

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