文件缓存

SinceVersion dev

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

原理

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

使用方式

File Cache 默认关闭,需要在 FE 和 BE 中设置相关参数进行开启。

FE 配置

单个会话中开启 File Cache:

  1. SET enable_file_cache = true;

全局开启 File Cache:

  1. SET GLOBAL enable_file_cache = true;

BE 配置

添加参数到 BE 节点的配置文件 conf/be.conf 中,并重启 BE 节点让配置生效。 | 参数 | 说明 | | —— | —— | | enable_file_cache | 是否启用 File Cache,默认 false | | file_cache_max_file_segment_size | 单个 Block 的大小上限,默认 4MB,需要大于 4096 | | file_cache_path | 缓存目录的相关配置,json格式,例子: [{“path”: “storage1”, “normal”:53687091200,”persistent”:21474836480,”query_limit”: “10737418240”},{“path”: “storage2”, “normal”:53687091200,”persistent”:21474836480},{“path”: “storage3”,”normal”:53687091200,”persistent”:21474836480}]。path 是缓存的保存路径,normal 是缓存的大小上限,query_limit 是单个查询能够使用的最大缓存大小,persistent / file_cache_max_file_segment_size 是最多缓存的 Block 数量。 | | enable_file_cache_query_limit | 是否限制单个 query 使用的缓存大小,默认 false | | clear_file_cache | BE 重启时是否删除之前的缓存数据,默认 false |

查看 File Cache 命中情况

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

  1. - FileCache:
  2. - IOHitCacheNum: 552
  3. - IOTotalNum: 835
  4. - ReadFromFileCacheBytes: 19.98 MB
  5. - ReadFromWriteCacheBytes: 0.00
  6. - ReadTotalBytes: 29.52 MB
  7. - WriteInFileCacheBytes: 915.77 MB
  8. - WriteInFileCacheNum: 283
  • IOTotalNum: 远程访问的次数
  • IOHitCacheNum: 命中缓存的次数
  • ReadFromFileCacheBytes: 从缓存文件中读取的数据量
  • ReadTotalBytes: 总共读取的数据量
  • SkipCacheBytes: 创建缓存文件失败,或者缓存文件被删,需要再次从远程读取的数据量
  • WriteInFileCacheBytes: 保存到缓存文件中的数据量
  • WriteInFileCacheNum: 保存的 Block 数量,所以 WriteInFileCacheBytes/WriteInFileCacheBytes 为 Block 的平均大小

IOHitCacheNum / IOTotalNum 等于1,表示缓存完全命中

ReadFromFileCacheBytes / ReadTotalBytes 等于1,表示缓存完全命中