跳转至

7.6 数据缓存

数据缓存( Data Cache )通过缓存最近访问的远端存储系统( HDFS 或对象存储)的数据文件,加速后续访问相同数据的查询。在频繁访问相同数据的查询场景中, Data Cache 可以避免重复的远端数据访问开销,提升热点数据的查询分析性能和稳定性。

1 原理

Data Cache 将访问的远程数据缓存到本地的 BE 节点。原始的数据文件会根据访问的 IO 大小切分为 BlockBlock 被存储到本地文件 cache_path/hash(filepath).substr(0, 3)/hash(filepath)/offset 中,并在 BE 节点中保存 Block 的元信息。当访问相同的远程文件时, doris 会检查本地缓存中是否存在该文件的缓存数据,并根据 Blockoffsetsize ,确认哪些数据从本地 Block 读取,哪些数据从远程拉起,并缓存远程拉取的新数据。 BE 节点重启的时候,扫描 cache_path 目录,恢复 Block 的元信息。当缓存大小达到阈值上限的时候,按照 LRU 原则清理长久未访问的 Block

2 使用方式

Data Cache 默认关闭,需要在 FEBE 中设置相关参数进行开启。

2.1 FE 配置

单个会话中开启 Data Cache

SQL
1
SET enable_file_cache = true;

全局开启 Data Cache

SQL
1
SET GLOBAL enable_file_cache = true;

Data Cache 功能仅作用于针对文件的外表查询(如 HiveHudi )。对内表查询,或非文件的外表查询(如 JDBCElasticsearch )等无影响。

2.2 BE 配置

添加参数到 BE 节点的配置文件 conf/be.conf 中,并重启 BE 节点让配置生效。

参数 必选项 说明
enable_file_cache 是否启用 Data Cache,默认 false
file_cache_path 缓存目录的相关配置,json格式,例子: [{"path": "/path/to/file_cache1", "total_size":53687091200,"query_limit": 10737418240},{"path": "/path/to/file_cache2", "total_size":53687091200,"query_limit": 10737418240},{"path": "/path/to/file_cache3", "total_size":53687091200,"query_limit": 10737418240, "normal_percent":85, "disposable_percent":10, "index_percent":5}]。path 是缓存的保存路径,total_size 是缓存的大小上限,query_limit 是单个查询能够使用的最大缓存大小,normal_percent, disposable_percent, index_percent 3个cache队列的百分比,他们之和是100
file_cache_min_file_segment_size 单个 Block 的大小下限,默认 1MB,需要大于 4096
file_cache_max_file_segment_size 单个 Block 的大小上限,默认 4MB,需要大于 4096
enable_file_cache_query_limit 是否限制单个 query 使用的缓存大小,默认 false
clear_file_cache BE 重启时是否删除之前的缓存数据,默认 false

3 缓存可观测性

3.1 查看 Data Cache 命中情况

执行 set enable_profile=true 打开会话变量,可以在 FEweb 页面的 Queris 标签中查看到作业的 ProfileData Cache 相关的指标如下:

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
- FileCache:  0ns
    - BytesScannedFromCache:  2.02  GB
    - BytesScannedFromRemote:  0.00  
    - BytesWriteIntoCache:  0.00  
    - LocalIOUseTimer:  2s723ms
    - NumLocalIOTotal:  444
    - NumRemoteIOTotal:  0
    - NumSkipCacheIOTotal:  0
    - RemoteIOUseTimer:  0ns
    - WriteCacheIOUseTimer:  0ns
  • BytesScannedFromCache :从本地缓存中读取的数据量。

  • BytesScannedFromRemote :从远端读取的数据量。

  • BytesWriteIntoCache :写入缓存的数据量。

  • LocalIOUseTimer :本地缓存的 IO 时间。

  • RemoteIOUseTimer :远端读取的 IO 时间。

  • NumLocalIOTotal :本地缓存的 IO 次数。

  • NumRemoteIOTotal :远端 IO 次数。

  • WriteCacheIOUseTimer :写入缓存的 IO 时间。

如果 BytesScannedFromRemote0 ,表示全部命中缓存。

3.2 监控指标

用户可以通过系统表 file_cache_statistics 查看各个 Backend 节点的缓存统计指标。