本文介绍云数据库 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
时,表示缓存完全命中。