概述
StarRocks提供了开箱即用的数据湖查询功能,适用于对湖中的数据进行探查式查询分析。Paimon是新一代的数据湖格式,提供了以下核心功能:
高效实时更新:高吞吐和低延迟的数据摄入和更新
统一的批处理和流处理:同时支持批量读写和流式读写
丰富的数据湖功能:ACID, Time Travel 和 Schema Evolution等
本文将介绍StarRocks基于Paimon湖格式的查询分析的场景与实践。
StarRocks + Paimon应用场景
湖仓分析:Flink+Paimon入湖,并利用StarRocks的分析能力更好地赋能给Paimon。
批处理:Paimon入湖作为ODS层之后,基于StarRocks物化视图来简化Pipeline的维护成本
整体数据存储在Paimon数据湖格式上,用StarRocks对湖上数据直接做查询加速
开启Data Cache提升查询性能
基于数据湖构建adhoc能力
场景:StarRocks + Paimon数据打造流批一体方案
数据在Paimon上,不直接查询,需要再做一些加工(ODS->DWD->DWS->ADS),把数据做宽表、聚合操作、结果表等,给上层用户提供简单统一接口。
基于外表的物化视图构建,透明加速,定时刷新
依赖 StarRocks 物化视图实现 ETL 数据加工,采用 StarRocks 原生格式进行高效转换
场景:BI报表,高并发低延迟报表
数据存储于 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>;