数据缓存

本文介绍云数据库 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":"/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"
    }
]

其中,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时,表示缓存完全命中。