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

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)オペレーター

中間結果のスピルを有効にする

中間結果のスピルを有効にするには、以下の手順に従ってください。

  1. BE設定ファイルbe.confでスピルディレクトリspill_local_storage_dirを指定し、クラスタを再起動して変更を有効にします。

    spill_local_storage_dir=/<dir_1>[;/<dir_2>]

    注意

    • 複数のspill_local_storage_dirをセミコロン(;)で区切って指定することができます。
    • 本番環境では、データストレージとスピルには異なるディスクを使用することを強く推奨します。中間結果がディスクにスピルされると、書き込み負荷とディスク使用量が大幅に増加する可能性があります。同じディスクを使用する場合、この増加はクラスタ内で実行中の他のクエリやタスクに影響を与える可能性があります。
  2. 中間結果のスピルを有効にするには、次の文を実行します。

    SET enable_spill = true;
  3. セッション変数spill_modeを使用して、中間結果のスピルモードを設定します。

    SET spill_mode = { "auto" | "force" };

    注意

    スピルを伴うクエリが完了するたびに、StarRocksは自動的にスピルされたデータをクリアします。BEがデータをクリアする前にクラッシュした場合、StarRocksはBEが再起動されるときにそれをクリアします。

    変数

    デフォルト

    説明

    enable_spill

    false

    中間結果のスピルを有効にするかどうか。trueに設定されている場合、StarRocksはクエリの集計、ソート、または結合演算子の処理時にメモリ使用量を削減するため、中間結果をディスクにスピルします。

    spill_mode

    auto

    中間結果のスピルモードを設定します。有効な値:

    • auto: メモリ使用量の閾値に達した場合、自動的にスピルがトリガーされます。
    • force: メモリ使用量に関係なく、StarRocksは関連するすべてのオペレーターに対してスピルを強制的に実行します。

    この変数は、変数enable_spilltrueに設定されている場合にのみ効果があります。

制限事項

  • スピルによって解決されないすべてのOOMの問題は解決することができません。たとえば、StarRocksは式の評価に使用されるメモリを解放することはできません。
  • 通常、スピルが関連するクエリでは、クエリのレイテンシが10倍に増加します。これらのクエリのクエリタイムアウトを延長するために、セッション変数query_timeoutを設定することをおすすめします。