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

データキャッシュ

Data Cacheは、リモートストレージシステム(HDFSまたはオブジェクトストレージ)から最近アクセスされたデータファイルをローカルディスクにキャッシュすることで、同一データの後続クエリを高速化します。同じデータに頻繁にアクセスするシナリオにおいて、Data Cacheは繰り返されるリモートデータアクセスのオーバーヘッドを回避し、ホットデータに対するクエリ分析のパフォーマンスと安定性を向上させることができます。

適用シナリオ

データキャッシュ機能は、Hive、Iceberg、Hudi、Paimonテーブルに対するクエリでのみ動作します。内部テーブルクエリやファイル以外の外部テーブルクエリ(JDBCやElasticsearchなど)には効果がありません。

データキャッシュがクエリ効率を向上させることができるかどうかは、複数の要因によって決まります。以下はデータキャッシュの適用シナリオです:

  • 高速ローカルディスク

    データキャッシュディレクトリには、SSDやNVMEメディアローカルディスクなどの高速ローカルディスクを使用することを推奨します。機械式ハードドライブをデータキャッシュディレクトリとして使用することは推奨しません。本質的に、ローカルディスクのIO帯域幅とIOPSは、ネットワーク帯域幅とソースストレージシステムのIO帯域幅およびIOPSよりも大幅に高くなければ、顕著なパフォーマンス向上をもたらしません。

  • 十分なキャッシュ容量サイズ

    データキャッシュは、キャッシュ追い出しポリシーとしてLRU戦略を使用します。クエリされるデータにホットとコールドの明確な区別がない場合、キャッシュされたデータが頻繁に更新および置換される可能性があり、これはクエリパフォーマンスを低下させる可能性があります。クエリパターンにホットとコールドの明確な区別がある(例:ほとんどのクエリが今日のデータのみにアクセスし、履歴データにはほとんどアクセスしない)シナリオで、かつキャッシュ容量がホットデータを格納するのに十分である場合に、データキャッシュを有効にすることを推奨します。

  • リモートストレージの不安定なIOレイテンシ

    この状況は通常HDFSストレージで発生します。多くの企業では、異なる事業部門が同じHDFSを共有しており、これによりピーク時に非常に不安定なIOレイテンシが発生する可能性があります。この場合、安定したIOレイテンシを確保する必要があるなら、データキャッシュを有効にすることを推奨します。ただし、最初の2つの条件も考慮すべきです。

Data Cacheの有効化

データキャッシュ機能はデフォルトで無効になっており、FEとBEで関連パラメータを設定することで有効にする必要があります。

BE設定

まず、be.confでキャッシュパス情報を設定し、BEノードを再起動して設定を有効にします。

パラメータ必須説明
enable_file_cacheはいData Cacheを有効にするかどうか、デフォルトはfalse
file_cache_pathはいキャッシュディレクトリに関する設定、JSON形式。
clear_file_cacheいいえデフォルトはfalse。trueの場合、BEノード再起動時にキャッシュディレクトリがクリアされます。

file_cache_pathの設定例:

file_cache_path=[{"path": "/path/to/file_cache1", "total_size":53687091200},{"path": "/path/to/file_cache2", "total_size":53687091200},{"path": "/path/to/file_cache3", "total_size":53687091200}]

path はキャッシュが保存されるパスで、1つまたは複数のパスを設定できます。ディスクごとに1つのパスのみを設定することを推奨します。

total_size はキャッシュ容量サイズの上限で、単位はバイトです。キャッシュ容量を超えた場合、LRU戦略を使用してキャッシュされたデータを削除します。

FE Configuration

単一セッションでData Cacheを有効にする:

SET enable_file_cache = true;

データキャッシュをグローバルに有効にする:

SET GLOBAL enable_file_cache = true;

enable_file_cacheが有効でない場合、BEがキャッシュディレクトリで設定されていても、キャッシュは使用されないことに注意してください。同様に、BEがキャッシュディレクトリで設定されていない場合、enable_file_cacheが有効であっても、キャッシュは使用されません。

キャッシュの可観測性

キャッシュヒット率の確認

set enable_profile=trueを実行してセッション変数を有効にすると、FE WebページのQueriesタブでジョブのProfileを確認できます。データキャッシュ関連のメトリクスは以下の通りです:

-  FileCache:  0ns
- BytesScannedFromCache: 2.02 GB
- BytesScannedFromRemote: 0.00
- BytesWriteIntoCache: 0.00
- LocalIOUseTimer: 2s723ms
- NumLocalIOTotal: 444
- NumRemoteIOTotal: 0
- NumSkipCacheIOTotal: 0
- RemoteIOUseTimer: 0ns
- WriteCacheIOUseTimer: 0ns
  • BytesScannedFromCache: ローカルキャッシュから読み取られたデータ量。

  • BytesScannedFromRemote: リモートから読み取られたデータ量。

  • BytesWriteIntoCache: キャッシュに書き込まれたデータ量。

  • LocalIOUseTimer: ローカルキャッシュのIO時間。

  • RemoteIOUseTimer: リモート読み取りのIO時間。

  • NumLocalIOTotal: ローカルキャッシュでのIO操作数。

  • NumRemoteIOTotal: リモートIO操作数。

  • WriteCacheIOUseTimer: キャッシュ書き込みのIO時間。

BytesScannedFromRemoteが0の場合、キャッシュが完全にヒットしていることを意味します。

監視メトリクス

ユーザーは、システムテーブルfile_cache_statisticsを通じて各Backendノードのキャッシュ統計を表示できます。

付録

原理

データキャッシングは、アクセスされたリモートデータをローカルBEノードにキャッシュします。元のデータファイルは、アクセスされたIOサイズに基づいてBlocksに分割され、Blocksはローカルファイルcache_path/hash(filepath).substr(0, 3)/hash(filepath)/offsetに格納され、BlockメタデータはBEノードに保存されます。同じリモートファイルにアクセスする際、dorisはローカルキャッシュにファイルのキャッシュデータが存在するかをチェックし、Blockのオフセットとサイズに基づいて、どのデータをローカルBlockから読み取り、どのデータをリモートから取得するかを決定し、新しく取得したリモートデータをキャッシュします。BEノードが再起動すると、cache_pathディレクトリをスキャンしてBlockメタデータを復元します。キャッシュサイズが上限に達すると、LRU原理に従って長期間未使用のBlocksをクリーンアップします。