全部产品
Search
文档中心

数据湖 OpenLake:StarRocks基于Paimon查询与分析的场景与实践

更新时间:Jan 19, 2026

概述

StarRocks提供了开箱即用的数据湖查询功能,适用于对湖中的数据进行探查式查询分析。Paimon是新一代的数据湖格式,提供了以下核心功能:

  • 高效实时更新:高吞吐和低延迟的数据摄入和更新

  • 统一的批处理和流处理:同时支持批量读写和流式读写

  • 丰富的数据湖功能:ACID, Time Travel 和 Schema Evolution等

本文将介绍StarRocks基于Paimon湖格式的查询分析的场景与实践。

StarRocks + Paimon应用场景

湖仓分析:Flink+Paimon入湖,并利用StarRocks的分析能力更好地赋能给Paimon。

批处理:Paimon入湖作为ODS层之后,基于StarRocks物化视图来简化Pipeline的维护成本

  1. 整体数据存储在Paimon数据湖格式上,用StarRocks对湖上数据直接做查询加速

    • 开启Data Cache提升查询性能

    • 基于数据湖构建adhoc能力

    • 场景:StarRocks + Paimon数据打造流批一体方案

  2. 数据在Paimon上,不直接查询,需要再做一些加工(ODS->DWD->DWS->ADS),把数据做宽表、聚合操作、结果表等,给上层用户提供简单统一接口。

    • 基于外表的物化视图构建,透明加速,定时刷新

    • 依赖 StarRocks 物化视图实现 ETL 数据加工,采用 StarRocks 原生格式进行高效转换

    • 场景:BI报表,高并发低延迟报表

  3. 数据存储于 Paimon,通过 StarRocks 作为计算引擎执行 ETL 任务,结果通过Data Sink写回数据湖

    • 支持物化视图自动调度与外部调度机制

    • 利用其物化视图自动调度与资源隔离能力实现高效数据加工

    • 将结果通过 Data Sink 写入数据湖

    • 场景:数据都在Paimon上,跨引擎数据共享需求

StarRocks针对Paimon的优化能力

  • 物化视图加速:

    • 提供异步刷新的物化视图能力,支持分区级数据更新;

    • 自动缓存热数据至 StarRocks 内存,结合查询改写技术动态选择执行路径。

  • Paimon 批量写入:

    • 原生支持 Paimon 表的 Batch Sink,兼容 Append/Update 表类型,确保加工结果实时回写数据湖。

  • 查询功能增强:

    • 完整支持 Paimon 表 DDL 操作与 Time Travel 查询,实现数据版本精确追溯

  • 性能优化引擎:

    • 使用 Native ORC/Parquet Reader 读取数据;

    • 元数据缓存与分布式处理机制,优化大规模查询;

    • 完善统计信息,提升CBO查询规划能力。

数据入湖

StarRocks查询Paimon湖格式的加速方式

在3.2.9及以上版本的StarRocks实例,StarRocks在创建Paimon Catalog后,可以直接查询Paimon表数据

StarRocks 作为 OLAP 查询引擎需要扫描 HDFS 或对象存储上的数据文件。查询实际读取的文件数量越多,I/O 开销也就越大。此外,在即席查询 (ad-hoc) 场景中,如果频繁访问相同数据,还会带来重复的 I/O 开销。

StarRocks通过使用Data Cache、异步物化视图等能力,可以为数据湖中的报表和应用实现更高的并发,以及更好的性能。

在以下情况下,建议优先通过Data Cache来实现加速:

  • 查询没有大量可复用的部分,并且可能涉及数据湖中的任何数据。

  • 远程存储存在显著的波动或不稳定性,可能会对访问产生潜在影响。

建议在以下情况下使用物化视图:

  • 在启用了Data Cache的情况下,查询性能仍不符合您对查询延迟和并发性的要求。

  • 查询涉及可复用的部分,如固定的聚合方式、Join模式。

  • 数据以分区方式组织,而查询聚合度较高(例如按天聚合)。

使用 StarRocks开启Delection Vector查询Paimon数据湖格式

开启方式:主键表建表语句配置'deletion-vectors.enabled' = 'true'

例如:

create table dv4 (
    id int,
    name string
) tblproperties (
    'bucket' = '1',
    'primary-key' = 'id',
    'file.format' = 'parquet',
    'deletion-vectors.enabled' = 'true'
);

使用 StarRocks开启Data Cache查询Paimon数据湖格式

StarRocks提供了 Data Cache 功能。通过将外部存储系统的原始数据按照一定策略切分成多个 block 后,缓存至 StarRocks 的本地节点,来避免重复的远端数据拉取开销,实现热点数据查询分析性能的进一步提升。StarRocks Data Cache已支持Paimon数据湖格式。

开启Data Cache的步骤

# 对于3.3版本,data cache,默认为true。对于3.2版本,data cache,默认为false,需要开启
datacache_enable=true
# 单个磁盘缓存数据量的上限,值可以为百分比,也可以为Byte数。默认为20%,即20%的磁盘最大容量。本示例修改为20GB
datacache_disk_size=21474836480
# 内存缓存数据量的上限,值可以为百分比,也可以为Byte数。默认为10%,本示例修改为4GB
datacache_mem_size=4294967296
# 缓存使用的磁盘路径,不可修改
datacache_disk_path=/opt/starrocks/be/storage/disk1/datacache

在集群重启完成后,在SQL Editor中执行

SET GLOBAL enable_scan_datacache = true;

即可使Data Cache在全局生效。

命中Data Cache

再次执行Paimon查询,如果命中了缓存,可以看到明显的查询效率提升。可以通过Query Profile查看是否命中了缓存。

开启profile后,在全部查询中,点击查询的id,进入profile页面下载profile,观察下述指标,即能够说明Data Cache的命中情况。

  • DataCacheReadBytes:从内存和磁盘中读取的数据量。

  • DataCacheWriteBytes:从外部存储系统加载到内存和磁盘的数据量。

如以下的示例显示,该查询在Data Cache里读取了10.107 GB的数据,而从外部文件系统中没有读取数据,表示缓存完全命中。

- DataCache:
 - DataCacheReadBlockBufferBytes: 920.146 MB
   - __MAX_OF_DataCacheReadBlockBufferBytes: 14.610 MB
   - __MIN_OF_DataCacheReadBlockBufferBytes: 1.762 MB
 - DataCacheReadBlockBufferCounter: 27.923K (27923)
   - __MAX_OF_DataCacheReadBlockBufferCounter: 440
   - __MIN_OF_DataCacheReadBlockBufferCounter: 55
 - DataCacheReadBytes: 10.107 GB
   - __MAX_OF_DataCacheReadBytes: 163.518 MB
   - __MIN_OF_DataCacheReadBytes: 20.225 MB
   - DataCacheReadDiskBytes: 563.468 MB
     - __MAX_OF_DataCacheReadDiskBytes: 30.965 MB
     - __MIN_OF_DataCacheReadDiskBytes: 0.000 B
   - DataCacheReadMemBytes: 9.556 GB
     - __MAX_OF_DataCacheReadMemBytes: 142.791 MB
     - __MIN_OF_DataCacheReadMemBytes: 20.225 MB
 - DataCacheReadCounter: 41.456K (41456)
   - __MAX_OF_DataCacheReadCounter: 655
   - __MIN_OF_DataCacheReadCounter: 81
 - DataCacheReadTimer: 9.157ms
   - __MAX_OF_DataCacheReadTimer: 48.792ms
   - __MIN_OF_DataCacheReadTimer: 478.759us
 - DataCacheSkipReadBytes: 0.000 B
 - DataCacheSkipReadCounter: 0
 - DataCacheWriteBytes: 0.000 B
 - DataCacheWriteCounter: 0
 - DataCacheWriteFailBytes: 0.000 B
 - DataCacheWriteFailCounter: 0
 - DataCacheWriteTimer: 0ns

在生产环境中,数据缓存的性能在不同查询模式下表现各异,通常能够实现从几十个百分点到数倍的提升。

使用 StarRocks 构建异步物化视图查询Paimon数据湖格式

生产环境中的应用程序经常基于多个大表执行复杂查询,涉及大量的数据关联和聚合。处理此类查询会大量消耗系统资源和时间,导致极高的查询成本。StarRocks可以使用异步物化视图解决此问题。

如果您在生产环境经常需要执行此查询,可以通过创建一个异步物化视图来加速查询,具体步骤可参考:使用物化视图加速数据湖查询

物化视图构建完成后,再次运行查询,StarRocks可以自动改写查询SQL,从物化视图里直接读取数据。

实际生产环境中,物化视图应用在对查询延迟要求非常高的场景,通常物化视图的构建方式会极大影响最终查询耗时,需要您根据业务需求和历史的查询SQL进行总结,选择合适的物化视图构建方式来满足具体的业务需求。

向Paimon表写入数据

说明
  • 在StarRocks中,写入Paimon表的方式为批量写入(Batch Write)。由于Paimon的限制,无法对Bucket Mode为HASH_DYNAMIC或CROSS_PARTITION的表进行写入。一个典型的场景是,当写入主键表时,如果该表的建表语句中的PROPERTIES未指定bucket,默认值将为-1(即Dynamic Bucket Mode),这将导致无法执行写入操作。

  • Paimon SDK要求写入的数据中的分区键或主键列不可为空值,而StarRocks在写入Paimon表时不会对即将写入的数据进行预检查,因此如果尝试将空值写入到包含值的Chunk时,将会抛出异常。

INSERT INTO <catalog_name>.<database_name>.<table_name> (column1, column2, ...) VALUES (value1, value2, ...);

例如,直接向ads_age_pvalue_analytics表插入以下数据。

INSERT INTO dlf_catalog.sr_dlf_db.ads_age_pvalue_analytics (final_gender_code, age_level, pvalue_level, clicks, total_behaviors)
VALUES 
('M', '18-24', 'Low', 1500, 2500),
('F', '25-34', 'Medium', 2200, 3300),
('M', '35-44', 'High', 2800, 4000);

Paimon数据导入至内表

假设StarRocks中存在一个OLAP表,表名为olap_tbl。您可以按照以下方式将Paimon表中的数据转换,并导入到StarRocks的olap_tbl表中。

INSERT INTO default_catalog.olap_db.olap_tbl SELECT * FROM <paimon_catalog>.<db_name>.<table_name>;