数据湖Data Cache

更新时间:
复制为 MD 格式

本文介绍数据湖 Data Cache 的工作原理、缓存机制及配置方法。通过将外部存储(HDFS、对象存储等)的热点数据缓存至 BE 节点本地,可显著减少重复 I/O 开销,提升数据湖查询性能。

功能介绍

在数据湖分析场景中,StarRocks 作为 OLAP 查询引擎需要频繁扫描 HDFS 或对象存储上的数据文件。针对即席查询(ad-hoc)等重复访问相同数据的场景,大量远端 I/O 会成为性能瓶颈。

StarRocks 自 v2.5 版本起提供数据湖 Data Cache 功能。该功能将外部存储的原始数据按 Block 切分后缓存至本地 BE 节点,避免重复拉取远端数据,提升热点数据的查询分析性能。

说明

Data Cache 仅在使用外部表(不含 JDBC 外部表)或通过 External Catalog 查询外部存储时生效,不适用于 StarRocks 原生表查询。自 v3.4.0 版本起,存算分离内表和数据湖查询共用同一个 Data Cache 实例,若您使用 v3.4.0 及以上版本,请参考存算分离 Data Cache 文档进行配置。

使用限制

  • StarRocks v2.5 及以上版本支持数据湖 Data Cache,v3.3.0 起默认开启。

  • 仅适用于外部表及 External Catalog 查询场景,不支持原生表查询。

  • 支持使用 StarRocks Native File Reader 的 External Catalog 类型(如 Hive、Iceberg、Hudi、Delta Lake、Paimon),不支持基于 JNI 访问数据的 Catalog(如 JDBC Catalog)。

说明

部分 Catalog 会根据条件自动选择数据访问方式。例如,Paimon Catalog 可能根据数据 Compaction 状态自动切换为 JNI 访问,此时 Data Cache 不生效。

缓存介质

StarRocks 以 BE/CN 节点的内存和磁盘作为缓存存储介质,支持以下缓存模式:

  • 全内存缓存:缓存速度最快,受限于内存容量。

  • 内存 + 磁盘两级缓存:扩大缓存容量,兼顾性能与成本。

说明

使用磁盘作为缓存介质时,缓存加速效果与磁盘性能直接相关,建议使用高性能云盘(如 ESSD PL1)。若磁盘性能一般,可通过增加多块盘来分散 I/O 压力。

缓存淘汰机制

Data Cache 的内存和磁盘各自独立进行数据淘汰。当使用内存 + 磁盘两级缓存时,工作机制如下:

  • 优先从内存读取数据;若内存未命中,则从磁盘读取,读取后尝试将数据加载至内存。

  • 从内存淘汰的数据尝试写入磁盘;从磁盘淘汰的数据则被废弃。

StarRocks Data Cache 支持 LRU 和 SLRU(Segmented LRU)两种淘汰策略,默认使用 SLRU。

说明

SLRU 策略需要 StarRocks v3.4 及以上版本支持。

SLRU 将缓存空间分为淘汰段保护段,均采用 LRU 策略:数据首次被访问时进入淘汰段;淘汰段中的数据再次被访问时,晋升至保护段;保护段中的数据被淘汰后重回淘汰段;淘汰段中的数据被淘汰后则移出缓存。与 LRU 相比,SLRU 能更好地抵御突发稀疏流量,保护高频访问数据不被一次性大规模查询直接淘汰。

开启和关闭 Data Cache

数据湖 Data Cache 由系统变量 enable_scan_datacache 和 BE 参数 datacache_enable 共同控制,v3.3.0 起默认开启。可通过以下 SQL 查询当前状态:

SHOW VARIABLES LIKE 'enable_scan_datacache';

主要配置参数如下:

参数

类型

默认值

说明

datacache_enable

BE 参数

true

是否启用 Data Cache。

enable_scan_datacache

系统变量

true

是否在查询中启用 Data Cache 加速。

datacache_mem_size

BE 参数

0

内存缓存上限。建议设置为内存总量的 10%~20%。

datacache_disk_size

BE 参数

0

单块磁盘缓存上限,可设为比例(如 80%)或物理值(如 2T500G)。

datacache_auto_adjust_enable

BE 参数

true

Data Cache 磁盘容量自动调整开关,启用后,会根据当前磁盘使用率动态调整缓存容量。即使 datacache_disk_size 为 0,系统也会自动根据磁盘使用率动态分配缓存空间。

如需禁用 Data Cache,执行以下命令:

SET GLOBAL enable_scan_datacache = false;

缓存填充规则

自 v3.3.2 起,为提高缓存命中率,StarRocks 按以下规则决定是否填充 Data Cache:

  • SELECT 查询(如 ANALYZE TABLEINSERT INTO SELECT)不填充缓存。

  • 扫描一张表的全部分区时不填充(仅有单个分区的表除外)。

  • 扫描一张表的全部列时不填充(仅有单列的表除外)。

  • 非 Hive、Paimon、Delta Lake、Hudi 或 Iceberg 的表不填充。

可通过 EXPLAIN VERBOSE 查看查询是否触发缓存填充:

EXPLAIN VERBOSE SELECT col1 FROM hudi_table;

返回结果中 dataCacheOptions={populate: false} 表示该查询不填充缓存。如需强制启用缓存填充,可设置:

SET populate_datacache_mode = 'always';

I/O 自适应

当缓存磁盘 I/O 负载过高时,Data Cache 的 I/O 自适应功能会自动将部分缓存请求路由至远端存储,同时利用本地缓存和远端存储共同提升 I/O 吞吐,避免磁盘访问出现明显长尾延迟。该功能默认开启。如需手动启用:

SET GLOBAL enable_datacache_io_adaptor = true;

Data Cache 可观测性

information_schema.be_datacache_metrics 视图记录了各 BE 节点 Data Cache 的内存和磁盘容量及用量信息:

SELECT * FROM information_schema.be_datacache_metrics;

字段

说明

BE_ID

BE 节点 ID。

STATUS

BE 节点状态,正常为 Normal

DISK_QUOTA_BYTES

用户配置的磁盘缓存容量上限(字节)。

DISK_USED_BYTES

当前实际使用的磁盘缓存空间(字节)。

MEM_QUOTA_BYTES

用户配置的内存缓存容量上限(字节)。

MEM_USED_BYTES

当前实际使用的内存缓存空间(字节)。

META_USED_BYTES

系统元数据占用的内存空间(字节)。

DIR_SPACES

磁盘上的 Cache 路径及对应的 Cache 大小。

查看 SQL 缓存命中情况

在查询 Profile 中观测以下指标,可了解当前查询的 Data Cache 命中情况:

指标

说明

DataCacheReadBytes

从内存和磁盘中读取的数据量。

DataCacheWriteBytes

从外部存储加载到内存和磁盘的数据量。

BytesRead

总共读取的数据量,包括内存、磁盘及外部存储。