Data Cache
本文介绍 Data Cache 的原理,以及如何开启 Data Cache 加速外部数据查询。
在数据湖分析场景中,StarRocks 作为 OLAP 查询引擎需要扫描 HDFS 或对象存储(下文简称为“外部存储系统”)上的数据文件。查询实际读取的文件数量越多,I/O 开销也就越大。此外,在即席查询 (ad-hoc) 场景中,如果频繁访问相同数据,还会带来重复的 I/O 开销。
为了进一步提升该场景下的查询性能,StarRocks 2.5 版本开始提供 Data Cache 功能。通过将外部存储系统的原始数据按照一定策略切分成多个 block 后,缓存至 StarRocks 的本地 BE 节点,从而避免重复的远端数据拉取开销,实现热点数据查询分析性能的进一步提升。Data Cache 仅在使用外部 表(不含 JDBC 外部表)和使用 External Catalog 查询外部存储系统中的数据时生效,在查询 StarRocks 原生表时不生效。
原理
StarRocks 将远端存储文件缓存至本地 BE 节点时,会将原始文件按照一定策略切分为相等大小的 block。block 是数据缓存的最小单元,大小可配置。当配置 block 大小为 1 MB 时,如果查询 Amazon S3 上一个 128 MB 的 Parquet 文件,StarRocks 会按照 1 MB 的步长,将该文件拆分成相等的 128 个 block,即 [0, 1 MB)、[1 MB, 2 MB)、[2 MB, 3 MB) ... [127 MB, 128 MB),并为每个 block 分配一个全局唯一 ID,即 cache key。Cache key 由三部分组成。
hash(filename) + fileModificationTime + blockId
说明如下。
| 组成项 | 说明 |
|---|---|
| filename | 数据文件名称。 |
| fileModificationTime | 数据文件最近一次修改时间。 |
| blockId | StarRocks 在拆分数据文件时为每个 block 分配的 ID。该 ID 在一个文件下是唯一的,非全局唯一。 |
假如该查询命中了 [1 MB, 2 MB) 这个 block,那么:
- StarRocks 检查缓存中是否存在该 block。
- 如存在,则从缓存中读取该 block; 如不存在,则从 Amazon S3 远端读取该 block 并将其缓存在 BE 上。
开启 Data Cache 后,StarRocks 会缓存从外部存储系统读取的数据文件。如不希望缓存某些数据,可进行如下设置。
SET enable_populate_datacache = false;
关于 enable_populate_datacache 的更多信息,参见 系统变量。
缓存介质
StarRocks 以 BE 节点的内存和磁盘作为缓存的存储介质,支持全内存缓存或者内存+磁盘的两级缓存。 注意,当使用磁盘作为缓存介质时,缓存加速效果和磁盘本身性能直接相关,建议使用高性能本地磁盘(如本地 NVMe 盘)进行数据缓存。如果磁盘本身性能一般,也可通过增加多块盘来减少单盘 I/O 压力。