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

Data Cache

データキャッシュ

このトピックでは、データキャッシュの動作原理と外部データのクエリパフォーマンスを向上させるためのデータキャッシュの有効化方法について説明します。

データレイクアナリティクスでは、StarRocksは、HDFSやAmazon S3などの外部ストレージシステムに格納されたデータファイルをスキャンするためのOLAPエンジンとして機能します。スキャンするファイルの数が増えると、I/Oのオーバーヘッドも増加します。また、一部のアドホックシナリオでは、同じデータに頻繁にアクセスすることにより、I/Oオーバーヘッドが増加します。

これらのシナリオでクエリのパフォーマンスを最適化するために、StarRocks 2.5では、データキャッシュ機能が提供されています。この機能は、外部ストレージシステムのデータを事前定義されたポリシーに基づいて複数のブロックに分割し、データをStarRocksバックエンド(BE)にキャッシュします。これにより、各アクセスリクエストに対してデータを外部システムから取得する必要がなくなり、ホットデータ上でのクエリと分析が高速化されます。データキャッシュは、外部カタログまたは外部テーブル(JDBC互換のデータベースを除く)を使用して外部ストレージシステムからデータをクエリする場合にのみ動作します。StarRocksネイティブテーブルをクエリする場合は機能しません。

動作原理

StarRocksは、外部ストレージシステムのデータを複数の同じサイズ(デフォルトでは1 MB)のブロックに分割し、BEにキャッシュします。ブロックは、データキャッシュの最小単位であり、設定可能です。

例えば、ブロックサイズを1 MBに設定し、Amazon S3から128 MBのParquetファイルをクエリしたい場合、StarRocksはファイルを128個のブロックに分割します。ブロックは[0, 1 MB)、[1 MB, 2 MB)、[2 MB, 3 MB) ... [127 MB, 128 MB)のようになります。StarRocksは、各ブロックにグローバルユニークIDであるキャッシュキーを割り当てます。キャッシュキーは以下の3つのパーツから構成されます。

hash(filename) + fileModificationTime + blockId

以下の表は、各パーツの説明を示しています。

コンポーネントの項目

説明

filename

データファイルの名前。

fileModificationTime

データファイルの最終変更時刻。

blockId

データファイルを分割する際にStarRocksがブロックに割り当てるID。このIDは、同じデータファイル内では一意ですが、StarRocksクラスタ内では一意ではありません。

クエリが[1 MB, 2 MB)のブロックにヒットする場合、StarRocksは以下の操作を実行します。

  1. ブロックがキャッシュに存在するかどうかを確認します。
  2. ブロックが存在する場合、StarRocksはキャッシュからブロックを読み取ります。ブロックが存在しない場合、StarRocksはブロックをAmazon S3から読み取り、BEにキャッシュします。

データキャッシュが有効になっている場合、StarRocksは外部ストレージシステムから読み取ったデータブロックをキャッシュします。このようなデータブロックをキャッシュしたくない場合は、次のコマンドを実行します。

SET enable_populate_block_cache = false;

enable_populate_block_cacheについての詳細は、システム変数を参照してください。

ブロックのストレージメディア

StarRocksは、BEマシンのメモリとディスクを使用してブロックをキャッシュします。メモリのみを使用するか、メモリとディスクの両方を使用するかのいずれかをサポートしています。

ディスクをストレージメディアとして使用する場合、キャッシュ速度はディスクのパフォーマンスに直接影響を受けます。したがって、データキャッシュにはNVMeディスクなどの高性能ディスクを使用することをお勧めします。高性能ディスクがない場合は、ディスクのI/O負荷を軽減するためにさらにディスクを追加することができます。

キャッシュの置換ポリシー

StarRocksは、最近使用されていない(LRU)のポリシーを使用してデータをキャッシュし、破棄します。

  • StarRocksはまずメモリからデータを読み取ります。データがメモリに見つからない場合、StarRocksはデータをディスクから読み取り、ディスクから読み取ったデータをメモリにロードしようとします。
  • メモリから破棄されたデータはディスクに書き込まれます。ディスクから破棄されたデータは削除されます。

データキャッシュの有効化

データキャッシュはデフォルトで無効になっています。この機能を有効にするには、StarRocksクラスタのFEおよびBEを設定します。

FEの設定

次のいずれかの方法を使用して、FEでデータキャッシュを有効にすることができます。

  • 要件に基づいて、特定のセッションでデータキャッシュを有効にします。

    SET enable_scan_block_cache = true;
  • アクティブなすべてのセッションでデータキャッシュを有効にします。

    SET GLOBAL enable_scan_block_cache = true;

BEの設定

各BEの conf/be.conf ファイルに以下のパラメータを追加します。その後、各BEを再起動して設定を有効にします。

パラメータ

説明

デフォルト値

block_cache_enable

データキャッシュを有効にするかどうか。

  • true:データキャッシュが有効になります。
  • false:データキャッシュが無効になります。

false

block_cache_disk_path

ディスクのパス。複数のディスクを構成し、セミコロン(;)でディスクのパスを区切ることができます。設定するパスの数は、BEマシンのディスクの数と同じにすることをお勧めします。BEが起動すると、StarRocksはディスクキャッシュディレクトリを自動的に作成します(親ディレクトリが存在しない場合は作成に失敗します)。

${STARROCKS_HOME}/block_cache

block_cache_meta_path

ブロックメタデータのストレージパス。このパラメータを指定しない場合は、省略できます。

${STARROCKS_HOME}/block_cache

block_cache_mem_size

メモリにキャッシュできる最大データ量。単位:バイト。このパラメータの値を少なくとも20 GBに設定することをお勧めします。データキャッシュが有効になった後、StarRocksがディスクから大量のデータを読み取る場合は、この値を増やすことを検討してください。

2147483648(2 GB)

block_cache_disk_size

単一のディスクにキャッシュできる最大データ量。単位:バイト。例えば、block_cache_disk_pathパラメータに2つのディスクパスを構成し、block_cache_disk_sizeパラメータの値を21474836480(20 GB)に設定する場合、これらの2つのディスクに最大40 GBのデータをキャッシュできます。

0(データをキャッシュするのにメモリのみを使用することを示す)

これらのパラメータの設定例を示します。


# データキャッシュを有効にします。
block_cache_enable = true

# ディスクパスを設定します。BEマシンに2つのディスクが搭載されていると仮定します。
block_cache_disk_path = /home/disk1/sr/dla_cache_data/;/home/disk2/sr/dla_cache_data/

# block_cache_mem_sizeを2 GBに設定します。
block_cache_mem_size = 2147483648

# block_cache_disk_sizeを1.2 TBに設定します。
block_cache_disk_size = 1288490188800

クエリがデータキャッシュにヒットしているかどうかを確認する

クエリプロファイルの以下のメトリックを分析することで、クエリがデータキャッシュにヒットしているかどうかを確認することができます。

  • BlockCacheReadBytes:StarRocksがメモリとディスクから直接読み取ったデータの量。
  • BlockCacheWriteBytes:外部ストレージシステムからStarRocksのメモリとディスクにロードされたデータの量。
  • BytesRead:読み取られたデータの総量。外部ストレージシステムからStarRocks、メモリ、およびディスクへのデータの読み取りを含みます。

例1:この例では、StarRocksは外部ストレージシステムから多量のデータ(7.65 GB)を読み取り、メモリとディスクからはほとんどのデータ(518.73 MB)を読み取っています。これは、ほとんどのデータキャッシュがヒットしていないことを意味します。

 - テーブル: lineorder
- BlockCacheReadBytes: 518.73 MB
- __MAX_OF_BlockCacheReadBytes: 4.73 MB
- __MIN_OF_BlockCacheReadBytes: 16.00 KB
- BlockCacheReadCounter: 684
- __MAX_OF_BlockCacheReadCounter: 4
- __MIN_OF_BlockCacheReadCounter: 0
- BlockCacheReadTimer: 737.357us
- BlockCacheWriteBytes: 7.65 GB
- __MAX_OF_BlockCacheWriteBytes: 64.39 MB
- __MIN_OF_BlockCacheWriteBytes: 0.00
- BlockCacheWriteCounter: 7.887K (7887)
- __MAX_OF_BlockCacheWriteCounter: 65
- __MIN_OF_BlockCacheWriteCounter: 0
- BlockCacheWriteTimer: 23.467ms
- __MAX_OF_BlockCacheWriteTimer: 62.280ms
- __MIN_OF_BlockCacheWriteTimer: 0ns
- BufferUnplugCount: 15
- __MAX_OF_BufferUnplugCount: 2
- __MIN_OF_BufferUnplugCount: 0
- BytesRead: 7.65 GB
- __MAX_OF_BytesRead: 64.39 MB
- __MIN_OF_BytesRead: 0.00

例2:この例では、StarRocksはデータキャッシュから大量のデータ(46.08 GB)を読み取り、外部ストレージシステムからデータを読み取っていません。つまり、StarRocksはデータをデータキャッシュのみから読み取っています。

テーブル:lineitem
- BlockCacheReadBytes: 46.08 GB
- __MAX_OF_BlockCacheReadBytes: 194.99 MB
- __MIN_OF_BlockCacheReadBytes: 81.25 MB
- BlockCacheReadCounter: 72.237K (72237)
- __MAX_OF_BlockCacheReadCounter: 299
- __MIN_OF_BlockCacheReadCounter: 118
- BlockCacheReadTimer: 856.481ms
- __MAX_OF_BlockCacheReadTimer: 1s547ms
- __MIN_OF_BlockCacheReadTimer: 261.824ms
- BlockCacheWriteBytes: 0.00
- BlockCacheWriteCounter: 0
- BlockCacheWriteTimer: 0ns
- BufferUnplugCount: 1.231K (1231)
- __MAX_OF_BufferUnplugCount: 81
- __MIN_OF_BufferUnplugCount: 35
- BytesRead: 46.08 GB
- __MAX_OF_BytesRead: 194.99 MB
- __MIN_OF_BytesRead: 81.25 MB