本文介绍云数据库 SelectDB 版中湖仓一体相关的数据缓存功能(File Cache),帮助您对外部数据源进行高效的联邦分析。
概述
File Cache通过缓存最近访问的远端存储系统(HDFS或对象存储)的数据文件,可加速后续访问相同数据的查询。在频繁访问相同数据的查询场景中,File Cache可以避免重复访问远端数据的开销,提升热点数据的查询分析性能和稳定性。
原理
File Cache将访问的远程数据缓存到SelectDB本地的BE节点。原始数据文件会根据访问的IO大小切分为Block,Block被存储到本地文件cache_path/hash(filepath).substr(0, 3)/hash(filepath)/offset中,并在BE节点中保存Block的元信息。
当访问相同的远程数据时,SelectDB会检查本地缓存中是否存在该文件的缓存数据,并根据Block的offset和size,确认哪些数据从本地Block读取,哪些数据从远程获取,并缓存远程拉取的新数据。BE节点重启时,会扫描cache_path目录并恢复Block的元信息。
当缓存大小达到阈值上限的时候,SelectDB会按照LRU原则清理长久未访问的Block。
使用方法
File Cache默认关闭,需要在FE和BE中同时设置相关参数进行开启。
FE配置
通过会话变量在当前会话中开启File Cache:
SET enable_file_cache = true;全局开启File Cache:
SET GLOBAL enable_file_cache = true;
File Cache功能仅作用于针对文件的外表查询(如 Hive、Hudi),对于内表查询或非文件的外表查询(如JDBC、Elasticsearch)等无影响。
BE配置
添加以下参数到BE节点的配置文件conf/be.conf中,并重启BE节点让配置生效。
参数  | 说明  | 
enable_file_cache  | 是否启用File Cache,默认true。  | 
file_cache_path  | 缓存目录的相关配置,JSON格式。例如: 其中,path是缓存的保存路径,total_size是缓存的大小上限,query_limit是单个查询能够使用的最大缓存大小。  | 
file_cache_min_file_segment_size  | 单个Block的大小下限,单位为B,默认1048576,需要大于4096。  | 
file_cache_max_file_segment_size  | 单个Block的大小上限,单位为B,默认为4194304,需要大于4096。  | 
enable_file_cache_query_limit  | 是否限制单个Query使用的缓存大小,默认false。  | 
clear_file_cache  | BE重启时是否删除之前的缓存数据,默认false。  | 
查看File Cache命中情况
执行set enable_profile=true打开会话变量,可以在FE的Web页面的Queris标签中查看到作业的Profile。File Cache相关的指标如下:
-  FileCache:
  -  IOHitCacheNum:  552
  -  IOTotalNum:  835
  -  ReadFromFileCacheBytes:  19.98  MB
  -  ReadFromWriteCacheBytes:  0.00  
  -  ReadTotalBytes:  29.52  MB
  -  WriteInFileCacheBytes:  915.77  MB
  -  WriteInFileCacheNum:  283 各参数含义如下:
参数  | 说明  | 
IOTotalNum  | 远程访问的次数。  | 
IOHitCacheNum  | 命中缓存的次数。  | 
ReadFromFileCacheBytes  | 从缓存文件中读取的数据量。  | 
ReadTotalBytes  | 总共读取的数据量。  | 
SkipCacheBytes  | 创建缓存文件失败,或者缓存文件被删,需要再次从远程读取的数据量。  | 
WriteInFileCacheBytes  | 保存到缓存文件中的数据量。  | 
WriteInFileCacheNum  | 保存的Block数量,WriteInFileCacheBytes/WriteInFileCacheBytes为Block的平均大小。  | 
其中:
IOHitCacheNum / IOTotalNum = 1时,表示缓存完全命中。ReadFromFileCacheBytes / ReadTotalBytes = 1时,表示缓存完全命中。