Data Cache预热

更新时间:
复制为 MD 格式

本文介绍如何通过 Data Cache 预热(Warmup)将远端数据提前载入 Data Cache,以减少冷启动对查询性能的影响。本功能同时适用于存算分离 Data Cache 和数据湖 Data Cache。

前提条件

已开启 Data Cache 功能,且当前用户对目标表拥有 SELECT 权限。

适用场景

在以下场景中,建议使用 Data Cache 预热:

  • 缓存盘容量充足:缓存盘的可用容量大于待预热的数据量。若磁盘容量不足,预热过程中新加载的数据会不断淘汰已缓存数据,无法达到预期效果。

  • 缓存访问较为稳定:预热期间,避免出现突发大量冷查询或大规模数据写入,否则会导致预热数据被提前淘汰。

  • POC 性能测试:需要排除外部存储系统的 I/O 干扰,单独测试 StarRocks 查询性能时,可通过预热提前将测试数据载入缓存。

  • 定时报表场景:业务方每天固定时间查看 BI 报表,可提前调度预热任务,保证查询性能稳定。

使用方式

StarRocks 提供 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

External Catalog 名称,仅在数据湖外表分析时使用。若已通过 SET CATALOG 切换到对应 Catalog,可省略。

db_name

数据库名称。若已切换到对应数据库,可省略。

table_name

目标表名称。

boolean_expression

WHERE 子句中的过滤条件,用于指定预热范围。

PROPERTIES

当前仅支持 verbose 属性,设置为 true 时返回各 BE 节点的详细预热指标。

执行成功后,返回以下预热指标:

指标

说明

READ_CACHE_SIZE

所有节点累计从 Data Cache 中读取的数据量。

WRITE_CACHE_SIZE

所有节点累计写入 Data Cache 的数据量。

AVG_WRITE_CACHE_TIME

每个节点将远端数据写入 Data Cache 的平均耗时。

TOTAL_CACHE_USAGE

预热完成后整个集群 Data Cache 的空间使用率,可用于评估缓存空间是否充足。

预热全表数据

预热外表 lineitem 的所有数据:

CACHE SELECT * FROM hive_catalog.test_db.lineitem;

按列和过滤条件预热

建议通过指定列名和 WHERE 谓词进行细粒度预热,以减少不必要的数据拉取,降低磁盘 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)

verbose 模式

默认情况下,CACHE SELECT 返回合并后的汇总指标。添加 PROPERTIES("verbose"="true") 可获取各个 BE 节点的详细指标,同时返回额外字段 AVG_READ_CACHE_TIME(每个节点在 Data Cache 命中下的平均读取耗时)。

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)

CACHE SELECT 定时调度

CACHE SELECT 可与 SUBMIT TASK 结合使用,实现周期性预热。

示例:每隔 5 分钟对 lineitem 表执行一次预热:

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 任务管理

查看已创建的任务

SELECT * FROM default_catalog.information_schema.tasks;

查看任务执行历史

SELECT * FROM default_catalog.information_schema.task_runs;

EXTRA_MESSAGE 字段记录了 CACHE SELECT 的相关预热指标。

删除任务

DROP TASK <task_name>;

最佳实践

场景一:POC 性能测试

通过 CACHE SELECT 提前将待测试的表数据载入 Data Cache,排除外部存储系统 I/O 干扰,获得更准确的性能基准。

场景二:BI 报表定时预热

业务方每天 8:00 查看 BI 报表,提交一个每天 7:00 执行的预热任务:

SUBMIT TASK BI SCHEDULE START('2024-02-03 07:00:00') EVERY(INTERVAL 1 DAY)
AS CACHE SELECT * FROM hive_catalog.test_db.lineitem
WHERE l_shipdate='1994-10-28';

场景三:降低预热对系统的影响

通过 SUBMIT TASKproperties 参数指定资源组和并行度(DOP),减少预热任务对正常业务查询的影响:

SUBMIT TASK cache_select PROPERTIES("pipeline_dop"="1", "resource_group"="warmup") SCHEDULE EVERY(INTERVAL 1 DAY)
AS CACHE SELECT * FROM hive_catalog.test_db.lineitem WHERE l_shipdate>='1994-10-28';

使用限制

  • CACHE SELECT 每次只能对单张表进行预热,不支持 ORDER BYLIMITGROUP BY 等算子。

  • 支持存算分离和存算一体架构的外表查询,支持预热远端的 TEXT、ORC、Parquet 文件。

  • 数据湖用户可通过 SHOW BACKENDS\GSHOW COMPUTE NODES\G 查看 Data Cache 剩余容量,判断是否会触发 LRU 淘汰;存算分离用户可通过存算分离监控指标查看缓存使用情况。