跳到主要内容
版本: 最新版本-3.5

数据缓存预热

一些数据湖分析和共享数据集群场景对查询的性能有较高要求,例如 BI 报表和概念验证 (PoC) 性能测试。将远程数据加载到本地数据缓存中可以避免多次获取相同数据,从而显著加快查询执行速度并最大限度地减少资源使用。

StarRocks v3.3 引入了数据缓存预热功能,这是对 数据缓存 的增强。数据缓存是被动填充缓存的过程,即在数据查询期间将数据写入缓存。但是,数据缓存预热是主动填充缓存的过程。它会提前主动从远程存储中获取所需数据。

使用场景

  • 用于数据缓存的磁盘的存储容量远大于要预热的数据量。如果磁盘容量小于要预热的数据,则无法达到预期的预热效果。例如,如果需要预热 100 GB 的数据,但磁盘只有 50 GB 的空间,那么只能将 50 GB 的数据加载到缓存中,并且先前加载的 50 GB 数据将被稍后加载的 50 GB 数据替换。
  • 用于数据缓存的磁盘上的数据访问相对稳定。如果访问量激增,则无法达到预期的预热效果。例如,如果需要预热 100 GB 的数据,并且磁盘有 200 GB 的空间,那么满足第一个条件。但是,如果在预热过程中将大量新数据 (150 GB) 写入缓存,或者如果意外的大型冷查询需要将 150 GB 的数据加载到缓存中,则可能会导致已预热的数据被逐出。

工作原理

StarRocks 提供了 CACHE SELECT 语法来实现数据缓存预热。在使用 CACHE SELECT 之前,请确保已启用数据缓存功能。

CACHE SELECT 的语法

CACHE SELECT <column_name> [, ...]
FROM [<catalog_name>.][<db_name>.]<table_name> [WHERE <boolean_expression>]
[PROPERTIES("verbose"="true")]

参数

  • column_name:要获取的列。您可以使用 * 获取外部表中的所有列。
  • catalog_name:外部 Catalog 的名称,仅在查询数据湖中的外部表时才需要。如果您已使用 SET CATALOG 切换到外部 Catalog,则可以将其省略。
  • db_name:数据库的名称。如果您已切换到该数据库,则可以将其省略。
  • table_name:要从中获取数据的表的名称。
  • boolean_expression:过滤条件。
  • PROPERTIES:目前仅支持 verbose 属性。它用于返回详细的预热指标。

CACHE SELECT 是一个同步过程,一次只能预热一个表。成功执行后,它将返回与预热相关的指标。

预热外部表中的所有数据

以下示例从外部表 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:所有节点从数据缓存读取的数据的总大小。
  • WRITE_CACHE_SIZE:所有节点写入数据缓存的数据的总大小。
  • AVG_WRITE_CACHE_TIME:每个节点将数据写入数据缓存所花费的平均时间。
  • TOTAL_CACHE_USAGE:此预热任务完成后整个集群的数据缓存的空间使用情况。此指标可用于评估数据缓存是否有足够的空间。

预热具有过滤条件的指定列

您可以指定列和谓词来实现细粒度的预热,这有助于减少要预热的数据量,从而减少磁盘 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 返回的指标是在多个 BE 上组合的指标。您可以在 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)

在 verbose 模式下,将返回一个额外的指标

  • AVG_READ_CACHE_TIME:当数据缓存命中时,每个节点读取数据的平均时间。

定期调度 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 任务

查看已创建的任务

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)

查看任务执行历史

mysql> select * from default_catalog.information_schema.task_runs;
+--------------------------------------+--------------+---------------------+---------------------+---------+---------------+------------------------------+---------------------------------------------------------------------+---------------------+------------+---------------+----------+------------------------------------------------------------------------------------------------------------------------+------------+
| QUERY_ID | TASK_NAME | CREATE_TIME | FINISH_TIME | STATE | CATALOG | DATABASE | DEFINITION | EXPIRE_TIME | ERROR_CODE | ERROR_MESSAGE | PROGRESS | EXTRA_MESSAGE | PROPERTIES |
+--------------------------------------+--------------+---------------------+---------------------+---------+---------------+------------------------------+---------------------------------------------------------------------+---------------------+------------+---------------+----------+------------------------------------------------------------------------------------------------------------------------+------------+
| 55b30204-f7da-11ee-b03e-7ea526d0b618 | always_cache | 2024-04-11 16:06:00 | 2024-04-11 16:07:22 | SUCCESS | emr_hive_test | zz_tpch_sf1000_hive_orc_zlib | cache select l_orderkey from lineitem where l_shipdate='1994-10-28' | 2024-04-12 16:06:00 | 0 | NULL | 100% | AlreadyCachedSize: 15.7GB, AvgReadCacheTime: 1ms, WriteCacheSize: 0B, AvgWriteCacheTime: 0s, TotalCacheUsage: 75.94% | |
| a2e3dc7e-f7d9-11ee-b03e-7ea526d0b618 | always_cache | 2024-04-11 16:01:00 | 2024-04-11 16:02:39 | SUCCESS | emr_hive_test | zz_tpch_sf1000_hive_orc_zlib | cache select l_orderkey from lineitem where l_shipdate='1994-10-28' | 2024-04-12 16:01:00 | 0 | NULL | 100% | AlreadyCachedSize: 15.7GB, AvgReadCacheTime: 1.2ms, WriteCacheSize: 0B, AvgWriteCacheTime: 0s, TotalCacheUsage: 75.87% | |
+--------------------------------------+--------------+---------------------+---------------------+---------+---------------+------------------------------+---------------------------------------------------------------------+---------------------+------------+---------------+----------+------------------------------------------------------------------------------------------------------------------------+------------+
2 rows in set (0.04 sec)

EXTRA_MESSAGE 字段记录 CACHE SELECT 的指标。

删除任务

DROP TASK <task_name>

用例

  1. 在 PoC 性能测试期间,如果您想评估 StarRocks 的性能而不受外部存储系统的干扰,您可以提前使用 CACHE SELECT 语句将要测试的表的数据加载到数据缓存中。

  2. 业务团队需要在每天上午 8 点查看 BI 报表。为了确保相对稳定的查询性能,您可以安排一个 CACHE SELECT 任务在每天上午 7 点开始运行。

    mysql> 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';
    +--------------+-----------+
    | TaskName | Status |
    +--------------+-----------+
    | BI | SUBMITTED |
    +--------------+-----------+
    1 row in set (0.03 sec)
  3. 为了最大限度地减少预热期间的系统资源消耗,您可以在 SUBMIT TASK 语句中指定会话变量。例如,您可以为 CACHE SELECT 任务指定一个资源组,调整并行度 (DOP),并在 WHERE 中指定过滤条件,以减少预热对常规查询的影响。

    mysql> 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';
    +--------------+-----------+
    | TaskName | Status |
    +--------------+-----------+
    | cache_select | SUBMITTED |
    +--------------+-----------+
    1 row in set (0.03 sec)

限制和使用注意事项

  • 要使用 CACHE SELECT,您必须首先启用数据缓存功能,并具有目标表的 SELECT 权限。
  • CACHE SELECT 仅支持预热单个表,不支持 ORDER BY、LIMIT 或 GROUP BY 等运算符。
  • CACHE SELECT 可以在共享存储和共享数据集群中使用。
  • CACHE SELECT 可以预热远程 TEXT、ORC、Parquet 文件。
  • CACHE SELECT 预热的数据可能不会永远保留在缓存中。缓存的数据可能仍然会根据数据缓存功能的 LRU 规则被逐出。
    • 如果您是数据湖用户,您可以使用 SHOW BACKENDS\GSHOW COMPUTE NODES\G 检查数据缓存的剩余容量,以评估是否可能发生 LRU 驱逐。
    • 如果您是共享数据集群用户,您可以通过查看共享数据集群的指标来检查数据缓存使用情况。
  • 目前,CACHE SELECT 的实现使用 INSERT INTO BLACKHOLE() 方法,该方法按照正常的查询过程预热表。因此,CACHE SELECT 的性能开销与常规查询类似。未来将进行改进以提高性能。

后续版本中的期望

未来,StarRocks 将引入自适应数据缓存预热,以确保更高的缓存命中率。