オートバケット
ユーザーは、不適切なbucket設定により様々な問題に遭遇することがよくあります。これに対処するため、bucketの数を設定する自動化されたアプローチを提供します。これは現在OLAP tableにのみ適用可能です。
この機能はCCRによって同期された場合に無効になります。このtableがCCRによってコピーされる場合、つまりPROPERTIESにis_being_synced = trueが含まれている場合、show create tableでは有効として表示されますが、実際には効果を発揮しません。is_being_syncedがfalseに設定されると、これらの機能は動作を再開しますが、is_being_syncedプロパティはCCR周辺モジュール専用であり、CCR同期中に手動で設定すべきではありません。
従来、ユーザーはtable作成時にbucketの数を手動で設定する必要がありましたが、自動bucket機能はApache Dorisがbucketの数を動的に投影する方法であり、bucketの数が常に適切な範囲内に留まり、ユーザーがbucketの数の詳細について心配する必要がありません。
明確にするため、この節ではbucketを2つの期間に分けます:初期bucketとその後のbucketです。初期とその後というのは、この機能を明確に説明するためにこの記事で使用される用語であり、Apache Dorisのbucketにおいてinitialやsubsequentはありません。
上記のbucket作成に関する節から分かるように、BUCKET_DESCは非常にシンプルですが、bucketの数を指定する必要があります。自動bucket投影機能では、BUCKET_DESCの構文によって直接bucketの数をAutoに変更し、新しいPropertiesの設定を追加します。
-- old version of the creation syntax for specifying the number of buckets
DISTRIBUTED BY HASH(site) BUCKETS 20
-- Newer versions use the creation syntax for automatic bucket imputation
DISTRIBUTED BY HASH(site) BUCKETS AUTO
properties("estimate_partition_size" = "100G")
新しい設定パラメータ estimate_partition_size は、単一パーティションのデータ量を示します。このパラメータはオプションであり、指定されない場合、Doris は estimate_partition_size のデフォルト値として10GBを使用します。
上記から分かるように、パーティション化されたバケットは物理レベルではタブレットであり、最高のパフォーマンスを得るためには、タブレットサイズを1GB - 10GBの範囲内にすることが推奨されます。では、自動バケット投影はどのようにしてタブレットサイズがこの範囲内になることを保証するのでしょうか?
要約すると、いくつかの原則があります。
- 全体的なデータボリュームが小さい場合、バケット数を高く設定すべきではありません
- 全体的なデータボリュームが大きい場合、バケット数はディスクブロックの総数に関連付けるべきであり、各BEマシンと各ディスクの容量を完全に活用するためです
プロパティ estimate_partition_size は alter をサポートしません
初期バケット投影
- データサイズに基づいてバケット数Nを取得します。最初に、
estimate_partition_sizeの値を5で割ります(Dorisでテキスト形式のデータを保存する際のデータ圧縮比5対1を考慮)。得られる結果は
(, 100MB), then take N=1
[100MB, 1GB), then take N=2
(1GB, ), then one bucket per GB
- BEノードの数と各BEノードのディスク容量に基づいて、バケット数Mを計算します。
Where each BE node counts as 1, and every 50G of disk capacity counts as 1.
The calculation rule for M is: M = Number of BE nodes * (Size of one disk block / 50GB) * Number of disk blocks.
For example: If there are 3 BEs, and each BE has 4 disks of 500GB, then M = 3 * (500GB / 50GB) * 4 = 120.
- 最終的なバケット数を取得するための計算ロジック。
Calculate an intermediate value x = min(M, N, 128).
If x < N and x < the number of BE nodes, the final bucket is y.
The number of BE nodes; otherwise, the final bucket is x.
- x = max(x, autobucket_min_buckets)、ここでautobucket_min_bucketsはConfig内で設定されます(デフォルトは1)
上記プロセスの疑似コード表現は以下の通りです
int N = Compute the N value;
int M = compute M value;
int y = number of BE nodes;
int x = min(M, N, 128);
if (x < N && x < y) {
return y;
}
return x;
上記のアルゴリズムを念頭に置いて、ロジックのこの部分をよりよく理解するためにいくつかの例を紹介しましょう。
case1:
Amount of data 100 MB, 10 BE machines, 2TB * 3 disks
Amount of data N = 1
BE disks M = 10* (2TB/50GB) * 3 = 1230
x = min(M, N, 128) = 1
Final: 1
case2:
Data volume 1GB, 3 BE machines, 500GB * 2 disks
Amount of data N = 2
BE disks M = 3* (500GB/50GB) * 2 = 60
x = min(M, N, 128) = 2
Final: 2
case3:
Data volume 100GB, 3 BE machines, 500GB * 2 disks
Amount of data N = 20
BE disks M = 3* (500GB/50GB) * 2 = 60
x = min(M, N, 128) = 20
Final: 20
case4:
Data volume 500GB, 3 BE machines, 1TB * 1 disk
Data volume N = 100
BE disks M = 3* (1TB /50GB) * 1 = 60
x = min(M, N, 128) = 63
Final: 63
case5:
Data volume 500GB, 10 BE machines, 2TB * 3 disks
Amount of data N = 100
BE disks M = 10* (2TB / 50GB) * 3 = 1230
x = min(M, N, 128) = 100
Final: 100
case 6:
Data volume 1TB, 10 BE machines, 2TB * 3 disks
Amount of data N = 205
BE disks M = 10* (2TB / 50GB) * 3 = 1230
x = min(M, N, 128) = 128
Final: 128
case 7:
Data volume 500GB, 1 BE machine, 100TB * 1 disk
Amount of data N = 100
BE disk M = 1* (100TB / 50GB) * 1 = 2048
x = min(M, N, 128) = 100
Final: 100
case 8:
Data volume 1TB, 200 BE machines, 4TB * 7 disks
Amount of data N = 205
BE disks M = 200* (4TB / 50GB) * 7 = 114800
x = min(M, N, 128) = 128
Final: 200
後続バケット投影
上記は初期バケット化の計算ロジックです。後続バケット化は、既に一定量のパーティションデータが存在するため、利用可能なパーティションデータの量に基づいて評価できます。後続バケットサイズは、最初の7つまでのパーティションのEMA[1](短期指数移動平均)値に基づいて評価され、これがestimate_partition_sizeとして使用されます。この時点で、パーティションバケットを計算する方法が2つあります。日単位でパーティション化すると仮定し、前方に数えて最初の日のパーティションサイズをS7、前方に数えて2日目のパーティションサイズをS6、そしてS1まで続きます。
- 7日間のパーティションデータが日々厳密に増加している場合、この時点でトレンド値が取得されます。6つのデルタ値があり、これらは
S7 - S6 = delta1,
S6 - S5 = delta2,
...
S2 - S1 = delta6
これによりema(delta)値が得られます。そして、今日のestimate_partition_size = S7 + ema(delta)
- 最初のケースではない場合、今回は直接前日のEMAの平均を取ります。今日のestimate_partition_size = EMA(S1, ... , S7) , S7)
上記のアルゴリズムによって、初期バケット数とその後のバケット数を計算できます。以前は固定のバケット数しか指定できませんでしたが、ビジネスデータの変化により、前のパーティションのバケット数と次のパーティションのバケット数が異なる可能性があります。これはユーザーには透過的であり、ユーザーは各パーティションの正確なバケット数を気にする必要がなく、この自動推定によりバケット数がより合理的になります。