本文介绍数据湖 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';主要配置参数如下:
参数 | 类型 | 默认值 | 说明 |
| BE 参数 |
| 是否启用 Data Cache。 |
| 系统变量 |
| 是否在查询中启用 Data Cache 加速。 |
| BE 参数 |
| 内存缓存上限。建议设置为内存总量的 10%~20%。 |
| BE 参数 |
| 单块磁盘缓存上限,可设为比例(如 |
| BE 参数 |
| Data Cache 磁盘容量自动调整开关,启用后,会根据当前磁盘使用率动态调整缓存容量。即使 |
如需禁用 Data Cache,执行以下命令:
SET GLOBAL enable_scan_datacache = false;缓存填充规则
自 v3.3.2 起,为提高缓存命中率,StarRocks 按以下规则决定是否填充 Data Cache:
非
SELECT查询(如ANALYZE TABLE、INSERT 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 节点状态,正常为 |
| 用户配置的磁盘缓存容量上限(字节)。 |
| 当前实际使用的磁盘缓存空间(字节)。 |
| 用户配置的内存缓存容量上限(字节)。 |
| 当前实际使用的内存缓存空间(字节)。 |
| 系统元数据占用的内存空间(字节)。 |
| 磁盘上的 Cache 路径及对应的 Cache 大小。 |
查看 SQL 缓存命中情况
在查询 Profile 中观测以下指标,可了解当前查询的 Data Cache 命中情况:
指标 | 说明 |
| 从内存和磁盘中读取的数据量。 |
| 从外部存储加载到内存和磁盘的数据量。 |
| 总共读取的数据量,包括内存、磁盘及外部存储。 |