数据湖分析能力边界
从 v2.3 版本开始,StarRocks 支持通过 External Catalog 管理外部数据源和分析数据湖中的数据。
本文介绍了 External Catalog 的能力边界以及所涉及功能的支持版本。
通用功能
本节列出了 External Catalog 功能的通用功能,包括存储系统、File Reader、认证、权限和 Data Cache。
外部存储系统
| 存储系统 | 支持版本 |
|---|---|
| HDFS | v2.3+ |
| AWS S3 | v2.3+ |
| Microsoft Azure Storage | v3.0+ |
| Google GCS | v3.0+ |
| 阿里云 OSS | v3.1+ |
| 华为云 OBS | v3.1+ |
| 腾讯云 COS | v3.1+ |
| 火山引擎 TOS | v3.1+ |
| 金山云 KS3 | v3.1+ |
| MinIO | v3.1+ |
| Ceph S3 | v3.1+ |
除了对上述存储系统的原生支持,StarRocks 还支持以下类型的对象存储:
- 兼容 HDFS 的对象存储,如 COS Cloud HDFS、OSS-HDFS 和 OBS PFS
- 描述:需要在 BE 配置项
fallback_to_hadoop_fs_list中指定对象存储 URI 前缀,并将云厂商提供的 .jar 包上传到目录 /lib/hadoop/hdfs/ 中。创建 External Catalog 时需要使用在fallback_to_hadoop_fs_list中指定的前缀。 - 支持版本:v3.1.9+、v3.2.4+
- 描述:需要在 BE 配置项
- 其他兼容 S3 的对象存储服务
- 描述:需要在 BE 配置项
s3_compatible_fs_list中指定对象存储 URI 前缀。创建 External Catalog 时需要使用在s3_compatible_fs_list中指定的前缀。 - 支持版本:v3.1.9+、v3.2.4+
- 描述:需要在 BE 配置项
压缩格式
本节仅列出了每种文件格式支持的压缩格式。有关各 External Catalog 支持的文件格式,请参阅对应章节。
| 文件格式 | 压缩格式 |
|---|---|
| Parquet | NO_COMPRESSION, SNAPPY, LZ4, ZSTD, GZIP, LZO (v3.1.5+) |
| ORC | NO_COMPRESSION, ZLIB, SNAPPY, LZO, LZ4, ZSTD |
| Text | NO_COMPRESSION, LZO (v3.1.5+) |
| Avro | NO_COMPRESSION (v3.2.1+), DEFLATE (v3.2.1+), SNAPPY (v3.2.1+), BZIP2 (v3.2.1+) |
| RCFile | NO_COMPRESSION (v3.2.1+), DEFLATE (v3.2.1+), SNAPPY (v3.2.1+), GZIP (v3.2.1+) |
| SequenceFile | NO_COMPRESSION (v3.2.1+), DEFLATE (v3.2.1+), SNAPPY (v3.2.1+), BZIP2 (v3.2.1+), GZIP (v3.2.1+) |
Avro、RCFile 和 SequenceFile 文件格式是通过 Java Native Interface(JNI)读取的,而非 StarRocks 原生 Reader。因此,对比 Parquet 和 ORC 格式,这些文件格式的读取性能可能较低。
管理、认证和权限
| 特性 | 描述 | 支持版本 |
|---|---|---|
| Information Schema | External Catalog 支持 Information Schema。 | v3.2+ |
| 数据湖访问控制 | External Catalog 支持 StarRocks 原生 RBAC。您可以像管理 StarRocks 内部数据一样,管理 External Catalog 中 数据库、表和视图(目前仅支持 Hive 视图和 Iceberg 视图)的权限。 | v3.0+ |
| 复用 Ranger 外部 Service | 支持复用 Apache Ranger 上的外部 Service(如 Hive Service)进行访问控制。 | v3.1.9+ |
| Kerberos 认证 | 支持 HDFS 或 Hive Metastore 的 Kerberos 认证。 | v2.3+ |
Data Cache
| 特性 | 描述 | 支持版本 |
|---|---|---|
| Data Cache (Block Cache) | 从 v2.5 开始,StarRocks 支持基于 CacheLib 实现的 Data Cache 功能(当时称为 Block Cache)。由于其可扩展性有限,从v3.0开始,StarRocks 重构了缓存功能,并添加了新功能,使 Data Cache 的性能在每个后续版本中逐渐提升。 | v2.5+ |
| 磁盘间数据 Rebalance | 支持数据 Rebalance 策略,确保数据倾斜控制在 10% 以内。 | v3.2+ |
| Data Cache 替换 Block Cache | 参数变更 BE 参数:
| v3.2+ |
| Data Cache 监控 API 新增指标 | 支持独立的 API 监控 Data Cache,包括缓存容量和命中率。可以通过接口 http://${BE_HOST}:${BE_HTTP_PORT}/api/datacache/stat 查看 Data Cache 的指标。 | v3.2.3+ |
| Data Cache 支持 Memory Tracker | Data Cache 支持 Memory Tracker。可以通过接口 http://${BE_HOST}:${BE_HTTP_PORT}/mem_tracker 查看内存相关指标。 | v3.1.8+ |
| Data Cache Warmup | 通过执行 CACHE SELECT,可以主动将所需数据从远程存储提前加载到缓存中,防止第一次查询时因获取数据花费过多时间。CACHE SELECT 不会打印数据或产生计算,只会拉取数据。 | v3.3+ |
Hive Catalog
元数据
通过 Hive catalogs 执行对 Hive 数据的查询时,StarRocks 会缓存表的元数据,以减少频繁访问远端存储的成本。此机制在确保数据新鲜度的同时,通过异步刷新和过期策略来保证查询性能。
缓存的元数据
StarRocks 在查询期间将缓存以下元数据:
-
表或分区级元数据
- 内容:
- 表信息:数据库、表结构、列名和分区键
- 分区信息:分区列表和分区位置
- 影响:检测表是否存在(表是否被删除和/或重新创建)
- Catalog 属性:
enable_metastore_cache:控制是否启用 metastore 缓存。默认值:true。metastore_cache_refresh_interval_sec:控制缓存元数据被视为新鲜的时间间隔。默认值:60。单位:秒。
- 位置:Metastore (HMS 或 Glue)
- 内容:
-
分区名称列表
- 内容:用于查找和修剪分区的分区名称列表。虽然分区名称列表已作为上述部分的分区信息收集,但在某些情况下有单独的配置来启用或禁用此功能。
- 影响:检测分区是否存在(是否有新分区或分区被删除和/或重新创建)
- Catalog 属性:
enable_cache_list_names:控制是否启用分区名称列表缓存。默认值:true。metastore_cache_refresh_interval_sec:控制缓存元数据被视为新鲜的时间间隔。默认值:60。单位:秒。
- 位置:Metastore (HMS 或 Glue)
-
文件级元数据
- 内容:分区文件夹下的文件路径。
- 影响:将数据加载到现有分区。
- Catalog 属性:
enable_remote_file_cache:控制是否启用远端存储中文件的元数据缓存。默认值:true。remote_file_cache_refresh_interval_sec:控制文件元数据被视为新鲜的时间间隔。默认值:60。单位:秒。remote_file_cache_memory_ratio:控制可用于文件元数据缓存的内存比例。默认值:0.1(10%)。
- 位置:远端存储 (HDFS 或 S3)
异步更新策略
以下 FE 配置项控制异步元数据更新策略:
| 配置项 | 默认值 | 描述 |
|---|---|---|
| enable_background_refresh_connector_metadata | v3.0 中为 truev2.5 中为 false | 是否启用定期的元数据缓存刷新。启用后,StarRocks 会轮询 metastore,并刷新频繁访问的 external catalog 的缓存元数据,以感知数据变化。true 表示启用 Hive 元数据缓存刷新,false 表示禁用。此项是一个 FE 动态参数。可以使用 ADMIN SET FRONTEND CONFIG 命令进行修改。 |
| background_refresh_metadata_interval_millis | 600000(10 分钟) | 两次连续元数据缓存刷新的间隔。单位:毫秒。此项是一个 FE 动态参数。可以使用 ADMIN SET FRONTEND CONFIG 命令进行修改。 |
| background_refresh_metadata_time_secs_since_last_access_secs | 86400(24 小时) | 元数据缓存刷新任务的过期时间。对于已访问的 external catalog,如果超过指定时间未被访问,StarRocks 将停止刷新其缓存元数据。对于未被访问的 external catalog,StarRocks 不会刷新其缓存元数据。单位:秒。此项是一个 FE 动态参数。可以使用 ADMIN SET FRONTEND CONFIG 命令进行修改。 |
元数据缓存行为
本节使用默认行为来解释元数据在元数据更新和查询期间的行为。
默认情况下,当查询一个表时,StarRocks 会缓存该表、分区和文件的元数据,并在接下来的 24 小时内保持活跃。在这 24 小时内,系统将确保缓存至少每 10 分钟刷新一次(注意,10 分钟是元数据刷新轮次的估计时间。如果有过多的 external table 待刷新元数据,整体元数据刷新间隔可能超过 10 分钟)。如果一个表超过 24 小时未被访问,StarRocks 将丢弃相关的元数据 。换句话说,您在 24 小时内进行的任何查询,最坏情况下将使用 10 分钟前的元数据。

具体来说:
- 假设第一个查询涉及表
A的分区P1。StarRocks 缓存表级元数据、分区名称列表和P1下的文件路径信息。缓存在查询执行时同步填充。 - 如果在缓存填充后 60 秒内提交第二个查询,并命中表
A的分区P1,StarRocks 将直接使用元数据缓存,此时 StarRocks 认为所有缓存的元数据都是新鲜的(metastore_cache_refresh_interval_sec和remote_file_cache_refresh_interval_sec控制 StarRocks 认为元数据新鲜的时间窗口)。 - 如果在 90 秒后提交第三个查询,并命中表
A的分区P1,StarRocks 仍将直接使用元数据缓存来完成查询。然而,由于自上次元数据刷新以来已超过 60 秒,StarRocks 将认为元数据已过期。因此,StarRocks 将启动对过期元数据的异步刷新。异步刷新不会影响当前查询的结果,因为查询仍将使用过时的元数据。 - 由于表
A的分区P1已被查询,预计在接下来的 24 小时内(由background_refresh_metadata_time_secs_since_last_access_secs控制),元数据将每 10 分钟(由background_refresh_metadata_interval_millis控制)刷新一次。元数据刷新轮次之间的实际间隔还取决于系统内的整体待刷新任务。 - 如果表
A在 24 小时内未参与任何查询,StarRocks 将在 24 小时后删除其元数据缓存。
最佳实践
元数据获取的性能很大程度取决于用户的 HMS 或 HDFS NameNode 的性能。请综合考虑所有因素并根据测试结果做出判断。
- [默认设置 推荐] 性能最佳,可以容忍分钟级别的数据不一致
- 设置:无需设置,默认情况下,10 分钟内更新的数据不可见。在此期间,查询将返回旧数据。
- 优点:查询性能最佳
- 缺点:延迟引起的数据不一致
- 支持版本:v2.5.5+(在 v2.5 中默认禁用,在 v3.0+ 中默认启用)
- 数据导入(产生新文件)立即可见,不依赖手动 Refresh
- 设置:通过将 Catalog 属性
enable_remote_file_cache设置为false禁用底层数据文件的元数据缓存。 - 优点:文件变更无延迟可见
- 缺点:禁用文件元数据缓存后,由于每次查询必须访问文件列表,导致性能较低。
- 支持版本:v2.5.5+
- 设置:通过将 Catalog 属性
- 分区增减立即可见,不依赖手动 Refresh
- 设置:通过将 Catalog 属性
enable_cache_list_names设置为false禁用 Hive 分区名缓存。 - 优点:分区变更无延迟可见
- 缺点:禁用分区列表缓存后,由于每次查询必须访问分区列表,导致性能较低。
- 支持版本:v2.5.5+
- 设置:通过将 Catalog 属性
如果您在 HMS 性能不佳的情况下需要实时获取变更,可以启用缓存,禁用自动增量更新,并通过调度系统在上游数据变更时手动调用 REFRESH EXTERNAL TABLE 命令刷新元数据。
存储系统
| 特性 | 描述 | 支持版本 |
|---|---|---|
| 递归读取子目录 | 通过将 Catalog 属性 enable_recursive_listing 设置为 true 启用递归读取子目录。启用递归读取后,StarRocks 将递归读取表或者分区目录(包括子目录)中文件的数据。该特性旨在解决文件目录嵌套多层的问题。 | v2.5.9+ v3.0.4+(v2.5 和 v3.0 版本默认禁用,v3.1+ 版本默认启用) |