数据湖Data Cache常见问题

更新时间:
复制为 MD 格式

本文整理了数据湖 Data Cache 使用过程中的常见问题及处理方法。

使用Data Cache

Data Cache 支持哪些 Catalog 类型?

Data Cache 目前支持使用 StarRocks Native File Reader 的 External Catalog 类型(如 Parquet/ORC/CSV Reader),包括 Hive、Iceberg、Hudi、Delta Lake 和 Paimon。基于 JNI 访问数据的 Catalog(如 JDBC Catalog)暂不支持。

说明

某些 Catalog 可能会根据特定条件(如文件类型和数据状态)使用不同的数据访问方法。例如,对于 Paimon Catalog,StarRocks 可能根据数据的 Compaction 状态自动选择 Native File Reader 或 JNI 访问。使用 JNI 访问时不支持 Data Cache 加速。

如何判断查询命中了缓存?

在查询对应的 Query Profile 中,查看以下指标:

  • DataCacheReadBytes:从本地缓存读取的数据量。

  • DataCacheReadCounter:本地缓存命中次数。

若上述指标大于 0,则表明查询命中了本地缓存。

- DataCacheReadBytes: 518.73 MB
  - __MAX_OF_DataCacheReadBytes: 4.73 MB
  - __MIN_OF_DataCacheReadBytes: 16.00 KB
- DataCacheReadCounter: 684
- DataCacheWriteBytes: 7.65 GB
- DataCacheWriteCounter: 7.887K (7887)

为什么启用Data Cache后查询未命中缓存?

请按以下步骤排查:

  1. 确认当前 Catalog 类型是否支持 Data Cache(需使用 StarRocks Native File Reader 的 Catalog,如 Hive、Iceberg、Hudi、Delta Lake、Paimon)。

  2. 检查查询是否符合缓存填充规则。可通过 EXPLAIN VERBOSE 查看:

EXPLAIN VERBOSE SELECT col1 FROM hudi_table;

若返回结果中包含 dataCacheOptions={populate: false},表示该查询不填充缓存(如扫描了全部分区)。

若需强制对该类查询启用缓存填充,可设置:

SET populate_datacache_mode = 'always';

Data Cache命中

为什么同一查询需要执行多次才能完全命中缓存?

当前版本中,Data Cache 默认使用异步填充模式,以减少对查询延迟的影响。异步填充下,单次查询只能缓存部分数据,需多次执行才能将查询所需数据全部缓存。

可选方案:

  • 通过设置 enable_datacache_async_populate_mode=false 切换为同步填充模式。

  • 通过 CACHE SELECT 提前预热目标数据。

为什么所有数据已缓存,但仍有少量请求直接访问远端存储?

当前版本默认启用 I/O 自适应功能。当磁盘 I/O 负载较高时,系统会自动将少量缓存请求路由到远端存储,以避免磁盘长尾延迟影响整体性能,这是预期行为。

如需禁用 I/O 自适应,执行:

SET enable_datacache_io_adaptor = false;

其他

如何清除缓存数据?

Data Cache 当前不提供直接清除缓存的接口,可选以下方案:

方案一(推荐):删除 BE/CN 节点上 datacache 目录中的所有数据(包括块文件和元数据目录),然后重启节点。

方案二:通过运行时缩小缓存配额间接清理,无需重启节点。示例:将指定节点的磁盘缓存配额缩小至 0,系统自动清理后再恢复原值:

UPDATE be_configs SET VALUE="0" WHERE NAME="datacache_disk_size" AND BE_ID=10005;
UPDATE be_configs SET VALUE="2T" WHERE NAME="datacache_disk_size" AND BE_ID=10005;
警告

执行上述语句时,请仔细确认 WHERE 条件,避免误操作影响其他节点或参数。

如何提高Data Cache性能?

Data Cache 本质上是用本地内存或磁盘替代远端存储访问,因此性能直接取决于本地缓存介质的质量。若发现缓存访问延迟较高,可考虑以下优化措施:

  • 优先使用高性能 NVMe 磁盘作为缓存磁盘。

  • 若无高性能磁盘,增加磁盘数量以分散 I/O 压力。

  • 适当增加 BE/CN 节点的服务器内存,利用操作系统 Page Cache 减少直接磁盘访问次数。