Spill to disk
ディスクへのスピル
このトピックでは、大規模なオペレーターの中間計算結果をディスクにスピルする方法について説明します。
概要
StarRocksのようなクエリ実行にインメモリコンピューティングを依存するデータベースシステムでは、集計、ソート、および結合演算子を使用するクエリを処理する際に、大量のメモリリソースを消費する場合があります。メモリ制限に達すると、これらのクエリはメモリ不足(OOM)のために強制終了されます。
ただし、特定のメモリ集約型のタスクを安定的に完了させ、パフォーマンスが最優先ではない場合(たとえば、マテリアライズドビューの構築、INSERT INTO SELECTを使用した軽量なETLの実行など)、メモリリソースを容易に枯渇させ、クラスタ内で実行中の他のクエリをブロックすることがあります。通常、この問題に対処するには、これらのタスクを個別に最適化することしかできず、リソースの分離戦略に依存する必要があります。これは特に いくつかの極端なシナリオでは不便であり、失敗する可能性があります。
StarRocks v3.0.1以降、StarRocksは一部のメモリ集約型オペレーターの中間結果をディスクにスピルすることをサポートしています。この機能を使用すると、パフォーマンスのわずかな低下と引き換えに、メモリ使用量を大幅に削減し、システムの可用性を向上させることができます。
現在、StarRocksのスピル機能は次のオペレーターをサポートしています。
- 集計オペレーター
- ソートオペレーター
- ハッシュ結合(LEFT JOIN、RIGHT JOIN、FULL JOIN、OUTER JOIN、SEMI JOIN、および INNER JOIN)オペレーター
中間結果のスピルを有効にする
中間結果のスピルを有効にするには、以下の手順に従ってください。
-
BE設定ファイルbe.confでスピルディレクトリ
spill_local_storage_dir
を指定し、クラスタを再起動して変更を有効にします。spill_local_storage_dir=/<dir_1>[;/<dir_2>]
注意
- 複数の
spill_local_storage_dir
をセミコロン(;
)で区切って指定することができます。 - 本番環境では、データストレージとスピルには異なるディスクを使用することを強く推奨します。中間結果がディスクにスピルされると、書き込み負荷とディスク使用量が大幅に増加する可能性があります。同じディスクを使用する場合、この増加はクラスタ内で実行中の他のクエリやタスクに影響を与える可能性があります。
- 複数の
-
中間結果のスピルを有効にするには、次の文を実行します。
SET enable_spill = true;
-
セッション変数
spill_mode
を使用して、中間結果のスピルモードを設定します。SET spill_mode = { "auto" | "force" };
注意
スピルを伴うクエリが完了するたびに、StarRocksは自動的にスピルされたデータをクリアします。BEがデータをクリアする前にクラッシュした場合、StarRocksはBEが再起動されるときにそれをクリアします。
変数
デフォルト
説明
enable_spill
false
中間結果のスピルを有効にするかどうか。
true
に設定されている場合、StarRocksはクエリの集計、ソート、または結合演算子の処理時にメモリ使用量を削減するため、中間結果をディスクにスピルします。spill_mode
auto
中間結果のスピルモードを設定します。有効な値:
auto
: メモリ使用量の閾値に達した場合、自動的にスピルがトリガーされます。force
: メモリ使用量に関係なく、StarRocksは関連するすべてのオペレーターに対してスピルを強制的に実行します。
この変数は、変数
enable_spill
がtrue
に設定されている場合にのみ効果があります。
制限事項
- スピルによって解決されないすべてのOOMの問題は解決することができません。たとえば、StarRocksは式の評価に使用されるメモリを解放することはできません。
- 通常、スピルが関連するクエリでは、クエリのレイテンシが10倍に増加します。これらのクエリのクエリタイムアウトを延長するために、セッション変数
query_timeout
を設定することをおすすめします。