Data Cache のウォームアップ
データレイク分析や共有データクラスタのシナリオでは、BIレポートや概念実証 (PoC) のパフォーマンステストなど、クエリに対する高いパフォーマンス要件があります。リモートデータをローカルData Cacheにロードすることで、同じデータを何度も取得する必要がなくなり、クエリの実行が大幅に高速化され、リソースの使用が最小限に抑えられます。
StarRocks v3.3 は、Data Cache の強化機能として、Data Cache Warmup 機能を導入しました。Data Cache は、データクエリ中に データがキャッシュに書き込まれる、キャッシュを受動的に埋めるプロセスです。一方、Data Cache Warmup はキャッシュを能動的に埋めるプロセスであり、リモートストレージから必要なデータを事前に積極的に取得します。
シナリオ
- Data Cacheに使用されるディスクのストレージ容量が、ウォームアップするデータ量よりもはるかに大きい場合。ディスク容量がウォームアップするデータ量より少ない場合、期待されるウォームアップ効果は得られません。例えば、100 GB のデータをウォームアップする必要があるが、ディスクに 50 GB のスペースしかない場合、50 GB のデータしかキャッシュにロードできず、以前にロードされた 50 GB のデータは後でロードされた 50 GB のデータによって置き換えられます。
- Data Cacheに使用されるディスクへのデータアクセスが比較的安定している場合。アクセス量が急増すると、期待されるウォームアップ効果は得られません。例えば、100 GB のデータをウォームアップする必要があり、ディスクに 200 GB のスペースがある場合、最初の条件は満たされます。しかし、ウォームアッププロセス中に大量の新しいデータ (150 GB) がキャッシュに書き込まれたり、予期しない大規模なコールドクエリが 150 GB のデータをキャッシュにロードする必要がある場合、ウォームアップされたデータが追い出される可能性があります。
動作の仕組み
StarRocks は、Data Cache Warmup を実装するために CACHE SELECT 構文を提供します。CACHE SELECT を使用する前に、Data Cache 機能が有効になっていることを確認してください。
CACHE SELECT の構文:
CACHE SELECT <column_name> [, ...]
FROM [<catalog_name>.][<db_name>.]<table_name> [WHERE <boolean_expression>]
[PROPERTIES("verbose"="true")]
パラメータ:
column_name
: 取得する列。外部テーブルのすべての列を取得するには*
を使用できます。catalog_name
: データレイク内の外部テーブルをクエリする場合にのみ必要な外部カタログの名前。SET CATALOG を使用して外部カタログに切り替えた場合、指定する必要はありません。db_name
: データベースの名前。そのデータベースに切り替えた場合、指定する必要はありません。table_name
: データを取得するテーブルの名前。boolean_expression
: フィルター条件。PROPERTIES
: 現在、verbose
プロパティのみがサポートされています。詳細なウォームアップメトリクスを返すために使用されます。
CACHE SELECT は同期プロセスであり、一度に 1 つのテーブルのみをウォームアップできます。実行が成功すると、ウォームアップ関連のメトリクスが返されます。
外部テーブルのすべてのデータをウォームアップする
次の例では、外部テーブル lineitem
からすべてのデータをロードします:
mysql> cache select * from hive_catalog.test_db.lineitem;
+-----------------+------------------+----------------------+-------------------+
| READ_CACHE_SIZE | WRITE_CACHE_SIZE | AVG_WRITE_CACHE_TIME | TOTAL_CACHE_USAGE |
+-----------------+------------------+----------------------+-------------------+
| 48.2MB | 3.7GB | 59ms | 96.83% |
+-----------------+------------------+----------------------+-------------------+
1 row in set (19.56 sec)
返されるフィールド:
READ_CACHE_SIZE
: すべてのノードによってData Cacheから読み取られたデータの合計サイズ。WRITE_CACHE_SIZE
: すべてのノードによってData Cacheに書き込まれたデータの合計サイズ。AVG_WRITE_CACHE_TIME
: 各ノードがData Cacheにデータを書き込むのにかかる平均時間。TOTAL_CACHE_USAGE
: このウォームアップタスクが完了した後のクラスタ全体のData Cacheのスペース使用量。このメトリクスは、Data Cacheに十分なスペースがあるかどうかを評価するために使用できます。
フィルター条件を指定して特定の列をウォームアップする
列と述語を指定して、細かいウォームアップを実現できます。これにより、ウォームアップするデータ量を減らし、ディスク I/O と CPU 消費を削減できます。
mysql> cache select l_orderkey from hive_catalog.test_db.lineitem where l_shipdate='1994-10-28';
+-----------------+------------------+----------------------+-------------------+
| READ_CACHE_SIZE | WRITE_CACHE_SIZE | AVG_WRITE_CACHE_TIME | TOTAL_CACHE_USAGE |
+-----------------+------------------+----------------------+-------------------+
| 957MB | 713.5MB | 3.6ms | 97.33% |
+-----------------+------------------+----------------------+-------------------+
1 row in set (9.07 sec)
次の例では、共有データクラスタ内のクラウドネイティブテーブル lineorder
から特定の列を事前取得します:
mysql> cache select lo_orderkey from ssb.lineorder;
+-----------------+------------------+----------------------+-------------------+
| READ_CACHE_SIZE | WRITE_CACHE_SIZE | AVG_WRITE_CACHE_TIME | TOTAL_CACHE_USAGE |
+-----------------+------------------+----------------------+-------------------+
| 118MB | 558.9MB | 200.6ms | 4.66% |
+-----------------+------------------+----------------------+-------------------+
1 row in set (29.88 sec)
詳細モードでウォームアップする
デフォルトでは、CACHE SELECT
によって返されるメトリクスは、複数の BEs にわたるメトリクスです。CACHE SELECT の末尾に PROPERTIES("verbose"="true")
を追加して、各 BE の詳細なメトリクスを取得できます。
mysql> cache select * from hive_catalog.test_db.lineitem properties("verbose"="true");
+---------------+-----------------+---------------------+------------------+----------------------+-------------------+
| IP | READ_CACHE_SIZE | AVG_READ_CACHE_TIME | WRITE_CACHE_SIZE | AVG_WRITE_CACHE_TIME | TOTAL_CACHE_USAGE |
+---------------+-----------------+---------------------+------------------+----------------------+-------------------+
| 172.26.80.233 | 376MB | 127.8micros | 0B | 0s | 3.85% |
| 172.26.80.231 | 272.5MB | 121.8micros | 20.7MB | 146.5micros | 3.91% |
| 172.26.80.232 | 355.5MB | 147.7micros | 0B | 0s | 3.91% |
+---------------+-----------------+---------------------+------------------+----------------------+-------------------+
3 rows in set (0.54 sec)
詳細モードでは、追加のメトリクスが返されます:
AVG_READ_CACHE_TIME
: Data Cacheがヒットしたときに各ノードがデータを読み取るのにかかる平均時間。
CACHE SELECT タスクの定期スケジューリング
CACHE SELECT を SUBMIT TASK と組み合わせて、定期的なウォームアップを実現で きます。例えば、次のケースでは、lineitem
テーブルを 5 分ごとにウォームアップします:
mysql> submit task always_cache schedule every(interval 5 minute) as cache select l_orderkey
from hive_catalog.test_db.lineitem
where l_shipdate='1994-10-28';
+--------------+-----------+
| TaskName | Status |
+--------------+-----------+
| always_cache | SUBMITTED |
+--------------+-----------+
1 row in set (0.03 sec)
CACHE SELECT タスクの管理
作成されたタスクを表示する
mysql> select * from default_catalog.information_schema.tasks;
+--------------+---------------------+-----------------------------------------------------+---------------+------------------------------+---------------------------------------------------------------------+---------------------+------------+
| TASK_NAME | CREATE_TIME | SCHEDULE | CATALOG | DATABASE | DEFINITION | EXPIRE_TIME | PROPERTIES |
+--------------+---------------------+-----------------------------------------------------+---------------+------------------------------+---------------------------------------------------------------------+---------------------+------------+
| always_cache | 2024-04-11 16:01:00 | PERIODICAL START(2024-04-11T16:01) EVERY(5 MINUTES) | emr_hive_test | zz_tpch_sf1000_hive_orc_zlib | cache select l_orderkey from lineitem where l_shipdate='1994-10-28' | NULL | |
+--------------+---------------------+-----------------------------------------------------+---------------+------------------------------+---------------------------------------------------------------------+---------------------+------------+
1 row in set (0.21 sec)