データキャッシュ
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;
Data Cacheをグローバルに有効にする:
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をクリーンアップします。