Colocate Join
Shuffle Join と Broadcast Join では、ジョイン条件が満たされると、2 つのジョインテーブルのデータ行が単一のノードにマージされてジョインが完了します。これらの 2 つのジョイン方法のいずれも、ノード間のデータネットワーク伝送によって引き起こされる遅延やオーバーヘッドを回避する ことはできません。
コアアイデアは、同じ Colocation Group 内のテーブルに対して、バケッティングキー、コピーの数、コピーの配置を一貫して保つことです。ジョイン列がバケッティングキーである場合、計算ノードは他のノードからデータを取得することなくローカルジョインを行うだけで済みます。Colocate Join は等値ジョインをサポートします。
このドキュメントでは、Colocate Join の原理、実装、使用法、および考慮事項を紹介します。
用語
- Colocation Group (CG): CG には 1 つ以上のテーブルが含まれます。CG 内のテーブルは同じバケッティングとレプリカ配置を持ち、Colocation Group Schema を使用して記述されます。
- Colocation Group Schema (CGS): CGS には、CG のバケッティングキー、バケットの数、およびレプリカの数が含まれます。
原理
Colocate Join は、同じ CGS を持つ一連のテーブルで CG を形成し、これらのテーブルの対応するバケットコピーが同じ BE ノードセットに配置されることを保証します。CG 内のテーブルがバケット化された列でジョイン操作を行うとき、ローカルデータを直接ジョインでき、ノード間のデータ転送の時間を節約できます。
バケットシーケンスは hash(key) mod buckets によって取得されます。たとえば、テーブル が 8 バケットを持っている場合、[0, 1, 2, 3, 4, 5, 6, 7] の 8 バケットがあり、各バケットには 1 つ以上のサブテーブルがあり、サブテーブルの数はパーティションの数に依存します。マルチパーティションテーブルの場合、複数のタブレットがあります。
同じデータ分布を持つために、同じ CG 内のテーブルは次のことを遵守する必要があります。
- 同じ CG 内のテーブルは、同一のバケッティングキー(タイプ、数、順序)と同じ数のバケットを持たなければなりません。これにより、複数のテーブルのデータスライスを一対一で分配および制御できます。バケッティングキーは、テーブル作成ステートメント
DISTRIBUTED BY HASH(col1, col2, ...)で指定された列です。バケッティングキーは、データのどの列が異なるバケットシーケンスにハッシュされるかを決定します。同じ CG 内のテーブルでバケッティングキーの名前は異なる場合があります。作成ステートメントでバケッティング列が異なる場合がありますが、DISTRIBUTED BY HASH(col1, col2, ...)の対応するデータ型の順序は完全に同じである必要があります。 - 同じ CG 内のテーブルは、異なる数のパーティションと異なるパーティションキーを持つことができます。
テーブルを作成するとき、CG はテーブルプロパティ内の属性 "colocate_with" = "group_name" によって指定されます。CG が存在しない場合、それはテーブルが CG の最初のテーブルであり、親テーブルと呼ばれます。親テーブルのデータ分布(スプリットバケットキーのタイプ、数、順序、コピーの数、スプリットバケットの数)が CGS を決定します。CG が存在する場合、テーブルのデータ分布が CGS と一致しているかどうかを確認します。
同じ CG 内のテーブルのコピー配置は次の条件を満たします。
- すべてのテーブルのバケットシーケンスと BE ノードのマッピングは、親テーブルと同じです。
- 親テーブル内のすべてのパーティションのバケットシーケンスと BE ノードのマッピングは、最初のパーティションと同じです。
- 親テーブルの最初のパーティションのバケットシーケンスと BE ノードのマッピングは、ネイティブのラウンドロビンアルゴリズムを使用して決定されます。
一貫したデータ分布とマッピングにより、バケッティングキーで取得された同じ値を持つデータ行が同じ BE に配置されることが保証されます。したがって、バケッティングキーを使用して列をジョインする場合、ローカルジョインのみが必要です。
使用法
テーブル作成
テーブルを作成する際に、PROPERTIES で属性 "colocate_with" = "group_name" を指定して、そのテーブルが Colocate Join テーブルであり、指定された Colocation Group に属することを示すことができます。
注意
バージョン 2.5.4 以降、異なるデータベースか らのテーブルで Colocate Join を実行できます。テーブルを作成する際に同じ
colocate_withプロパティを指定するだけです。
例:
CREATE TABLE tbl (k1 int, v1 int sum)
DISTRIBUTED BY HASH(k1)
BUCKETS 8
PROPERTIES(
"colocate_with" = "group1"
);
指定されたグループが存在しない場合、StarRocks は現在のテーブルのみを含むグループを自動的に作成します。グループが存在する場合、StarRocks は現在のテーブルが Colocation Group Schema を満たしているかどうかを確認します。満たしている場合、テーブルを作成し、グループに追加します。同時に、テーブルは既存のグループのデータ分布ルールに基づいてパーティションとタブレットを作成します。
Colocation Group はデータベースに属します。Colocation Group の名前はデータベース内で一意です。内部ストレージでは、Colocation Group の完全な名前は dbId_groupName ですが、groupName だけを認識します。
注意
異なるデータベースからのテーブルを Colocate Join に関連付けるために同じ Colocation Group を指定する場合、Colocation Group はこれらのデータベースのそれぞれに存在します。異なるデータベースの Colocation Group を確認するには、
show proc "/colocation_group"を実行できます。
削除
完全な削除は、リサイクルビンからの削除です。通常、DROP TABLE コマンドでテーブルを削除した後、デフォルトでは 1 日間リサイクルビンに残り、その後削除されます。グループ内の最後のテーブルが完全に削除されると、グループも自動的に削除されます。
グループ情報の表示
次のコマンドを使用して、クラスター内に既に存在するグループ情報を表示できます。
SHOW PROC '/colocation_group';
+-------------+--------------+--------------+------------+----------------+----------+----------+
| GroupId | GroupName | TableIds | BucketsNum | ReplicationNum | DistCols | IsStable |
+-------------+--------------+--------------+------------+----------------+----------+----------+
| 10005.10008 | 10005_group1 | 10007, 10040 | 10 | 3 | int(11) | true |
+-------------+--------------+--------------+------------+----------------+----------+----------+
- GroupId: クラスター全体で一意のグループ識別子で、前半が db id、後半がグループ id です。
- GroupName: グループの完全な名前。
- TabletIds: グループ内のテーブルの id リスト。
- BucketsNum: バケットの数。
- ReplicationNum: レプリカの数。
- DistCols: 分布列、つまりバケッティング列のタイプ。
- IsStable: グループが安定しているかどうか(安定性の定義については、Colocation Replica Balancing and Repair のセクションを参照してください)。
次のコマンドを使用して、グループのデータ分布をさらに表示できます。
SHOW PROC '/colocation_group/10005.10008';
+-------------+---------------------+
| BucketIndex | BackendIds |
+-------------+---------------------+
| 0 | 10004, 10002, 10001 |
| 1 | 10003, 10002, 10004 |
| 2 | 10002, 10004, 10001 |
| 3 | 10003, 10002, 10004 |
| 4 | 10002, 10004, 10003 |
| 5 | 10003, 10002, 10001 |
| 6 | 10003, 10004, 10001 |
| 7 | 10003, 10004, 10002 |
+-------------+---------------------+
- BucketIndex: バケットのシーケンスの添字。
- BackendIds: バケッティングデータスライスが配置されている BE ノードの id。
注意: 上記のコマンドを使用するには、NODE 権限または
cluster_adminロールが必要です。通常のユーザーはアクセスできません。
テーブルグループプロパティの変更
テーブルの Colocation Group プロパティを変更できます。例:
ALTER TABLE tbl SET ("colocate_with" = "group2");
テーブルが以前にグループに割り当てられていない場合、コマンドはスキーマを確認し、テーブルをグループに追加します(グループが存在しない場合は最初に作成されます)。テーブルが以前に別のグループに割り当てられていた場合、コマンドはテーブルを元のグループから削除し、新しいグループに追加します(グループが存在しない場合は最初に作成されます)。
次のコマンドを使用して、テーブルの Colocation プロパティを削除することもできます。
ALTER TABLE tbl SET ("colocate_with" = "");
その他の関連操作
Colocation 属性を持つテーブルに ADD PARTITION を使用してパーティションを追加したり、コピーの数を変更したりする場合、StarRocks はその操作が Colocation Group Schema に違反するかどうかを確認し、違反する場 合は拒否します。
Colocation レプリカのバランシングと修復
Colocation テーブルのレプリカ分布は、グループスキーマで指定された分布ルールに従う必要があるため、通常のシャーディングとはレプリカの修復とバランシングの点で異なります。
グループ自体には stable プロパティがあります。stable が true の場合、グループ内のテーブルスライスに変更が加えられておらず、Colocation 機能が正常に動作していることを意味します。stable が false の場合、現在のグループ内の一部のテーブルスライスが修復または移行されており、影響を受けたテーブルの Colocate Join が通常のジョインに劣化することを意味します。
レプリカ修復
レプリカは指定された BE ノードにのみ保存できます。StarRocks は、利用できない BE(例: ダウン、廃止)を置き換えるために最も負荷の少ない BE を探します。置き換え後、古い BE 上のすべてのバケッティングデータスライスが修復されます。移行中、グループは Unstable とマークされます。