StarRocks x Paimon 构建极速实时湖仓分析架构实践

Paimon 介绍

Apache Paimon 是新一代的湖格式,可以使用 Flink 和 Spark 构建实时 Lakehouse 架构,以进行流式处理和批处理操作。Paimon 创新性地使用 LSM(日志结构合并树)结构,将实时流式更新引入 Lakehouse 架构中。

Paimon 提供以下核心功能:

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

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

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

StarRocks 介绍

Linux 基金会项目 StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库,遵循 Apache 2.0 开源协议。StarRocks 架构简洁,采用了全面向量化引擎,并配备全新设计的 CBO (Cost Based Optimizer) 优化器,查询速度(尤其是多表关联查询)远超同类产品。

StarRocks 不仅能高效的分析本地存储的数据,也可以作为计算引擎直接分析数据湖中的数据。用户可以通过 StarRocks 提供的 External Catalog,轻松查询存储在 Apache Paimon 数据湖上的数据,无需进行数据迁移。支持的存储系统包括 HDFS、阿里云 OSS、阿里云 OSS-HDFS 等

本文将介绍如何使用 StarRocks 和 Paimon 构建高效的数据湖分析架构,利用 StarRocks 达到极致的 Paimon 查询效率,并给出详细的操作步骤和性能测试数据。

本文主要内容:

  1. 快 - 使用 StarRocks 直接查询 Paimon 湖格式

  2. 更快 - 开启 Data cache 查询 Paimon 湖格式

  3. 超级快 - 构建异步物化视图查询 Paimon 湖格式

PART/ 01 快-使用 StarRocks 直接查询 Paimon 湖格式

StarRocks 支持 Catalog(数据目录)功能,实现在一套系统内同时维护内、外部数据,不需要手动建外表,指定数据源路径,即可轻松访问并查询各类数据湖格式,例如 Hive,Paimon,Iceberg 等。开箱即用,不需要任何数据导入和迁移。

例如:在 StarRocks 里创建一个 filesystem 类型的 Paimon Catalog:

CREATE EXTERNAL CATALOG paimon_fs_catalog
properties
( "type" = "paimon","paimon.catalog.type" = "filesystem","paimon.catalog.warehouse" = "oss://<bucket>/paimon/warehouse"
);

执行 SQL 查询 Paimon 数据湖(以 TPC-H Q1 为例):

selectl_returnflag,l_linestatus,sum(l_quantity) as sum_qty,sum(l_extendedprice) as sum_base_price,sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,avg(l_quantity) as avg_qty,avg(l_extendedprice) as avg_price,avg(l_discount) as avg_disc,count(*) as count_order
frompaimon_fs_catalog.paimon_tpch_flat_orc_100lineitem
wherel_shipdate <= date '1998-12-01' - interval '90' day
group byl_returnflag,l_linestatus
order byl_returnflag,l_linestatus

我们使用相同的硬件资源(配置详情见附录),对比了 StarRocks 和 Trino 分别查询Paimon Append Only 表格式的 TPC-H 100G 数据集,Trino 使用了最新的 Paimon-Trino 版本,已包含了对 ORC 文件读取的优化,测试结果如下:

在这里插入图片描述

StarRocks 的总耗时为 148.92s,Trino 的总耗时为 640.8s

可以得到,在本测试场景下,StarRocks 的查询效率是 Trino 的 4.3倍。

使用 StarRocks 直接查询 Paimon 数据是实际生产环境中最常见的场景,操作简单,可以满足大部分 Paimon 数据湖分析的需求。

PART/ 02 更快-开启 Data Cache查询 Paimon 湖格式

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

为了进一步提升该场景下的查询性能,StarRocks 2.5 版本开始提供 Data Cache 功能。通过将外部存储系统的原始数据按照一定策略切分成多个 Block 后,缓存至 StarRocks 的本地节点,从而避免重复的远端数据拉取开销,实现热点数据查询分析性能的进一步提升。

例如:开启 Data Cache 的步骤

  1. BE 增加如下配置并重启:
# 开启data cachedatacache_enable=true# 单个磁盘缓存数据量的上限,本示例20Gdatacache_disk_size=21474836480# 内存缓存数据量的上限,本示例4Gdatacache_mem_size=4294967296# 缓存使用的磁盘路径datacache_disk_path=/mnt/disk1/starrocks/storage/datacache;/mnt/disk2/starrocks/storage/datacache;/mnt/disk3/starrocks/storage/datacache;/mnt/disk4/starrocks/storage/datacache
  1. MySQL 客户端执行:
SET enable_scan_datacache = true;

我们可以在 Query Profile 里观测当前 Query 的 Cache 命中情况,观测下述指标查看 Data Cache 的命中情况:

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

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

如以下的示例,显示该 Query 在 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

我们开启 Data Cache 后,再次执行 TPC-H 100G 基准测试,第一次执行总耗时为134.59s,第二次执行总耗时为 110.2s,第三次执行总耗时 113.12s,第一次相对后两次较慢是因为 StarRocks 要从对象存储 OSS 里拉数据,并做本地 Cache,后两次从 Profile 可以看到基本全命中本地 Cache 做运算,执行时间稳定在 110s 左右。

可以得到,在本测试场景下,开启 Cache 之后,查****询性能提升了35.4%左右

在生产环境中,Data Cache 的性能在不同的 Query Pattern 以及不同的数据量下,查询性能有从百****分之几十到几倍的提升。

PART/ 03 超级快-构建异步物化视图查询 Paimon 湖格式

生产环境环境中的应用程序经常基于多个大表执行复杂查询,通常涉及大量的数据的关联和聚合。处理此类查询通常会大量消耗系统资源和时间,造成极高的查询成本,StarRocks 可以使用异步物化视图解决以上问题。异步物化视图是一种特殊的物理表,其中存储了基于基表特定查询语句的预计算结果。当您对基表执行复杂查询时,StarRocks 可以直接复用预计算结果,避免重复计算,进而提高查询性能。

我们以 TPC-H Q1 的查询 SQL 为例,演示如何创建 Paimon 湖格式的异步物化视图:

CREATE MATERIALIZED VIEW lineitem
DISTRIBUTED BY HASH(l_shipdate)
REFRESH IMMEDIATE  MANUAL
AS
selectl_returnflag,l_linestatus,l_shipdate,sum(l_quantity) as sum_qty,sum(l_extendedprice) as sum_base_price,sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,avg(l_quantity) as avg_qty,avg(l_extendedprice) as avg_price,avg(l_discount) as avg_disc,count(*) as count_order
frompaimon_fs_catalog.paimon_tpch_flat_orc_100.lineitem
group byl_returnflag,l_linestatus,l_shipdate

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

在本测试场景下,TPC-H Q1 执行时间从直接查询 Paimon 数据湖的 3.5秒左右缩短到0.04s 左右。

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

PART/ 04 当前总结

当前 StarRocks x Paimon 的能力主要包括:

  1. 支持各类存储系统,包括 HDFS 以及对象存储 S3/OSS/OSS-HDFS

  2. 支持 HMS 以及阿里云 DLF 元数据管理系统

  3. 支持 Paimon 的 Primary Key 和 Append Only 表类型查询

  4. 支持 Paimon 系统表的查询,常见例如 Read Optimized 表,snapshots 表等

  5. 支持 Paimon 表和其他类型数据湖格式的关联查询

  6. 支持 Paimon 表和 StarRocks 内表的关联查询

  7. 支持 Data Cache 加速查询

  8. 支持基于 Paimon 表构建物化视图实现透明加速,查询改写等

对于 Primary Key 表类型,我们对 Read Optimized 系统表做了完善的性能优化,可以与 Append Only 表一样充分利用 Native reader 的能力,得到直接查询 Paimon数据的最佳性能。直接查询 Primary Key 表的情况下,若 Primary Key 表里包含没有做 Compaction 的数据,StarRocks 里会通过 JNI 调用 Java 读取这部分内容,性能会有一定的损耗。即使是这种情况,在我们收到客户反馈里,平均还是会有相对Trino 达到3倍以上的性能提升。

PART/ 05 未来规划

接下来,我们会继续完善 StarRocks x Paimon 的支持能力,包括:

  • 使用 Native reader 支持 Primary Key 表的 Deletion vectors,进一步加速查询性能

  • 缓存 Paimon 元数据,减少重复 I/O 和降低 Analyze 阶段的延时

  • 接入 Paimon 表统计信息,优化复杂 SQL 的执行计划

  • 完善 Paimon 异步物化视图查询和改写功能


===

附录:本文性能测试环境说明


阿里云 EMR on ECS 数据湖集群:

  • EMR版本:EMR-5.16.0版本

  • 集群配置:1x master, 3x core

  • 机型:ecs.g6.4xlarge 16 vCPU 64 GiB

  • Trino版本:427

  • Paimon 版本:0.7

  • Paimon TPC-H 测试表类型:Append only,存储格式为ORC


EMR Serveless StarRocks 集群

StarRocks版本:3.2.4


测试软件配置

  • Trino

  • -Xmx50G

  • query.max-total-memory: 105GB

  • query.max-memory: 105GB

  • query.max-memory-per-node: 35GB

  • StarRocks

  • -Xmx50G


测试数据和步骤

  • 性能测试基准:TPCH 100G

  • 测试方法:每个 Query 跑3次取平均值,不做预热,不预先收集统计信息,测试数据放在 OSS

更多交流,联系我们:https://wx.focussend.com/weComLink/mobileQrCodeLink/33412/8da64

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/316642.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

医学vr虚拟仿真综合实验教学平台为科研教学提供了坚实的基础

在兽医专业的广袤领域中&#xff0c;动物解剖学作为基石学科&#xff0c;为组织胚胎学、生理学、病理解剖学、外科手术学、临床诊断学等科研教学提供了坚实的基础。而如今&#xff0c;随着科技的飞速发展&#xff0c;我们迎来了一个全新的学习时代——3D数字动物解刨虚拟仿真实…

[iOS]使用CocoaPods发布公开库

1.检查库名是否已被占用 选择库名时&#xff0c;尽量选择具有描述性并且独特的名字&#xff0c;这不仅可以避免命名冲突&#xff0c;还可以帮助用户更好地理解库的用途和功能。 在实际创建和发布 CocoaPods 库之前&#xff0c;确实应该检查库名是否已经被占用&#xff0c;以避…

AutoCAD 2025 for mac/win:设计未来,触手可及

在数字化时代&#xff0c;设计不再局限于纸笔之间&#xff0c;而是跃然于屏幕之上&#xff0c;AutoCAD 2025正是这一变革的杰出代表。无论是Mac用户还是Windows用户&#xff0c;AutoCAD 2025都以其卓越的性能和出色的用户体验&#xff0c;成为了CAD设计绘图领域的佼佼者。 Aut…

Vuforia AR篇(三)— AR模型出场效果

目录 前言一、AR模型出场二、AR出场特效三、添加过渡效果四、效果 前言 在这个数字化日益增长的时代&#xff0c;增强现实&#xff08;AR&#xff09;技术正以前所未有的速度发展。AR模型&#xff0c;作为这一技术的核心组成部分&#xff0c;不仅改变了我们与数字世界的互动方…

【MATLAB源码-第201期】基于matlab的黏菌群优化算法(SMA)无人机三维路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 黏菌优化算法&#xff08;Slime Mould Algorithm, SMA&#xff09;是一种新颖的启发式优化方法&#xff0c;其灵感来源于自然界中的真菌——黏菌。这种算法模拟了黏菌在寻找食物时的行为和网络形成策略。在本文中&#xff0c…

Python | Leetcode Python题解之第58题最后一个单词的长度

题目&#xff1a; 题解&#xff1a; class Solution:def lengthOfLastWord(self, s: str) -> int:ls[]for i in s.split():ls.append(i)return len(ls[-1])

【华为】NAT的分类和实验配置

【华为】NAT的分类和实验配置 NAT产生的技术背景IP地址分类NAT技术原理NAT分类静态NAT动态NATNAPTEasy IP&#xff08;PAT&#xff09;NAT Server 配置拓扑静态NAT测试抓包 动态NAT测试抓包 NAPT测试抓包 PAT测试抓包 NAT Server检测抓包 PC1PC2服务器 NAT产生的技术背景 随着…

排序算法:插入、希尔、选择、推排、冒泡、快速、归并排序

排序算法 目录 前言 一、排序的概念 1.1排序的概念 1.2 常见的排序算法 二、常见排序算法的实现 2.1 插入排序 2.2 希尔排序 2.3 选择排序 2.4 堆排序 2.5 冒泡排序 2.6 快速排序 2.6.1 hoare版本 2.6.2 前后指针版本 2.6.3 非递归版本 2.7 归并排序 归并排序 2.8 计数排序 三、…

Android视角看鸿蒙第十二课-鸿蒙的布局之相对布局RelativeContainer

Android视角看鸿蒙第十二课-鸿蒙的布局之相对布局RelativeContainer 导读 相对布局和线性、层叠布局一样都是类似于Android布局的&#xff0c;之前两篇文章已经了解线性、层叠布局的使用方法&#xff0c;这篇文章一起来学习下鸿蒙中的相对布局。 之前的文章中&#xff0c;我偶…

10.MMD 室内场景导入背景视频和灯光

导入背景视频 1. 导入人物和场景 场景是Akali’s room&#xff0c;可以在墙壁上添加视频 先添加主场景 2. 修改视频文件格式 在背景里选择导入背景视频文件 需要将mp4视频格式转化为AVI格式 方法一 先将视频导入格式工厂 点击配置 将视频编码改成DivX 再开始处理 …

数据结构八:线性表之循环队列的设计

上篇博客&#xff0c;学习了栈&#xff0c;我们可以知道他也是一种线性表&#xff0c;遵从先进后出的原则&#xff0c;在本节&#xff0c;我们进一步学习另一种线性表—队列。就像饭堂里排队打饭的的队伍&#xff0c;作为一种先进先出的线性表&#xff0c;他又有哪些特别之处呢…

敏捷之Scrum开发

目录 一、什么是 Scrum 1.1 Scrum 的定义 二、Scrum 迭代开发过程 2.1 迭代开发过程说明 2.1.1 开发方法 2.1.1.1 增量模型 2.1.1.1.1 定义 2.1.1.1.2 模型方法说明 2.1.1.2 迭代模型 2.1.1.2.1 定义 2.1.1.2.2 模型方法说明 2.1.2 迭代过程 2.1.2.1 产品需求Produ…

windows下安装onlyoffice

文章目录 1、 安装ErLang2、 安装rabbitmq3、 安装postgresql4、 安装onlyoffice(社区版) 1、 安装ErLang 下载地址&#xff1a;https://erlang.org/download/otp_win64_24.2.exe opt_wind64_24.2.exe 直接运行&#xff0c;一步一步安装 2、 安装rabbitmq 下载地址&#xf…

【003_音频开发_基础篇_Linux进程通信(20种你了解几种?)】

003_音频开发_基础篇_Linux进程通信&#xff08;20种你了解几种&#xff1f;) 文章目录 003_音频开发_基础篇_Linux进程通信&#xff08;20种你了解几种&#xff1f;)创作背景Linux 进程通信类型fork() 函数fork() 输出 2 次fork() 输出 8 次fork() 返回值fork() 创建子进程 方…

JAVA:maven-->>检查 所有依赖 与 环境 兼容

内容 为了确保你项目中的所有依赖都彼此兼容&#xff0c;并与你的环境相适应&#xff0c;你可以利用 Maven 的依赖管理功能。Maven 有助于解决、升级&#xff0c;并对齐所有库的版本&#xff0c;以避免任何不一致或冲突。以下是检查兼容性的步骤&#xff1a; ### 检查兼容性的…

Pulsar Meetup 深圳 2024 会务介绍

“ Hi&#xff0c;各位热爱 Pulsar 的小伙伴们&#xff0c;Pulsar Meetup 深圳 2024 报名倒计时啦&#xff0c;快来报名。这里汇集了腾讯、华为和谙流科技等大量 Pulsar 大咖&#xff0c;干货多多&#xff0c;礼品多多&#xff0c;不容错过啊。 ” 活动介绍 由 AscentStream 谙…

C语言:插入排序

插入排序 1.解释2.步骤3.举例分析示例结果分析 1.解释 插入排序是一种简单直观的排序算法&#xff0c;它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上&#xff0c;通常采…

[Android]Jetpack Compose加载图标和图片

一、加载本地矢量图标 在 Android 开发中使用本地矢量图标是一种常见的做法&#xff0c;因为矢量图标&#xff08;通常保存为 SVG 或 Android 的 XML vector format&#xff09;具有可缩放性和较小的文件大小。 在 Jetpack Compose 中加载本地矢量图标可以使用内置的支持&…

服务器数据恢复—ESXi无法识别数据存储和VMFS文件系统如何恢复数据?

服务器数据恢复环境&#xff1a; 一台某品牌服务器&#xff0c;通过FreeNAS来做iSCSI&#xff0c;然后使用两台同品牌服务器做ESXi虚拟化系统。 FreeNAS层为UFS2文件系统&#xff0c;使用整个存储建一个稀疏模式的文件&#xff0c;挂载到ESXi虚拟化系统。ESXi虚拟化系统中有3台…

解决VSCode中“#include错误,请更新includePath“问题

目录 1、问题原因 2、解决办法 1、问题原因 在编写C程序时&#xff0c;想引用头文件但是出现如下提示&#xff1a; &#xff08;1&#xff09;首先检查要引用的头文件是否存在&#xff0c;位于哪里。 &#xff08;2&#xff09;如果头文件存在&#xff0c;在编译时提醒VSCo…