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

news2024/11/24 3:35:41

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 为例):

select
  l_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
from
  paimon_fs_catalog.paimon_tpch_flat_orc_100lineitem
where
  l_shipdate <= date '1998-12-01' - interval '90' day
group by
  l_returnflag,
  l_linestatus
order by
  l_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
select
  l_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
from
  paimon_fs_catalog.paimon_tpch_flat_orc_100.lineitem
group by
  l_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.coloradmin.cn/o/1627077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spark原理之Cache Table的工作原理及实现自动缓存重复表的思考

CACHE TABLE的能力 使用此语法&#xff0c;可以由用户自定义要缓存的结果集&#xff0c;实际上就是一个临时表&#xff0c;不过数据存储在Spark集群内部&#xff0c;由Application所分配的executors管理。 一旦定义了一个缓存表&#xff0c;就可以在SQL脚本中随处引用这个表名…

HTTP 网络协议的请求头信息,响应头信息,具体详解(2024-04-26)

1、通用头部 2、常见的 HTTP请求头信息 HTTP 响应头信息是服务器在响应客户端的HTTP请求时发送的一系列头字段&#xff0c;它们提供了关于响应的附加信息和服务器的指令。 3、常见的 HTTP 响应头信息 响应头向客户端提供一些额外信息&#xff0c;比如谁在发送响应、响应者的功…

数据分析:甲基化分析-从DNA methylation的IDAT文件到CpG site的Beta values

介绍 DNA Methylation和疾病的发生发展存在密切相关&#xff0c;它一般通过CH3替换碱基5‘碳的H原子&#xff0c;进而调控基因的转录。常用的DNA methylation是Illumina Infinium methylation arrays&#xff0c;该芯片有450K和850K&#xff08;也即是EPIC&#xff09;。 该脚…

深入解析YOLOv2

深入解析YOLOv2 引言 目标检测是计算机视觉中的一个核心问题&#xff0c;它旨在识别图像中所有感兴趣的目标&#xff0c;并给出它们的类别和位置。近年来&#xff0c;随着深度学习技术的发展&#xff0c;目标检测领域取得了巨大的进步。YOLO&#xff08;You Only Look Once&a…

STM32的Flash读写保护

参考链接 STM32的Flash读写保护&#xff0c;SWD引脚锁的各种解决办法汇总&#xff08;2020-03-10&#xff09;-腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1597959 STM32系列芯片Flash解除写保护的办法 - 知乎 (zhihu.com)https://zh…

Xcode for Mac:强大易用的集成开发环境

Xcode for Mac是一款专为苹果开发者打造的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它集成了代码编辑器、编译器、调试器等一系列开发工具&#xff0c;让开发者能够在同一界面内完成应用的开发、测试和调试工作。 Xcode for Mac v15.2正式版下载 Xcode支持多种编程…

采购数据分析驾驶舱分享,照着它抄作业

今天我们来看一张采购管理驾驶舱。这是一张充分运用了多种数据可视化图表、智能分析功能&#xff0c;从物料和供应商的角度全面分析采购情况的BI数据可视化报表&#xff0c;主要分为三个部分&#xff0c;接下来就分部分来了解一下。 第一部分&#xff1a;关键指标计算及颜色预…

基于Anaconda搭建Pytorch环境

准备虚拟环境 创建一个虚拟创建&#xff1a; conda create --name nlp python3.11.7激活虚拟环境&#xff1a; conda activate nlp安装pytorh 首先&#xff0c;可以通过任务管理器查看你的电脑是否支持GPU&#xff1a; 如果支持&#xff0c;到网址&#xff1a;https://py…

了解HTTP代理服务器:优势、分类及应用实践

在我们日常的网络使用中&#xff0c;我们经常听到HTTP代理服务器这个术语。那么&#xff0c;HTTP代理服务器到底是什么&#xff1f;它有什么优势和分类&#xff1f;又如何应用于实践中呢&#xff1f;让我们一起来了解一下。 HTTP代理服务器是一种位于客户端和服务器之间的中间…

鸿蒙南向开发环境的搭建(OpenHarmony)

在嵌入式开发中&#xff0c;很多开发者习惯于使用Windows进行代码的编辑&#xff0c;比如使用Windows的Visual StudioCode进行OpenHarmony代码的开发。但当前阶段&#xff0c;大部分的开发板源码还不支持在Windows环境下进行编译&#xff0c;如Hi3861、Hi3516系列开发板。因此&…

2024年智能手表行业线上市场销售数据分析

智能手表市场近几年随着各大厂商的加入&#xff0c;逐渐朝着专业化、智能化发展。从一开始被认为是“智商税”、“鸡肋产品”到如今可以成为人体心脑血管健康监测、专业运动测速、移动定位的“多功能电子管家”&#xff0c;智能手表市场仍在不断发展中。 根据鲸参谋数据显示&a…

CSS中设置透明度的2个属性:opacity,RGBA以及它们的区别

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

关于SSL加密,您应该知道什么?

SSL加密&#xff0c;全称为安全套接字层加密&#xff0c;是一种网络安全协议&#xff0c;主要用于在网络通信中提供隐私和数据完整性。它通过在客户端和服务器之间建立一个加密的通道&#xff0c;确保数据在传输过程中不被窃取或篡改。随着互联网的普及和电子商务的快速发展&am…

多种方法求1+12+123+1234……

有网友出了一道题&#xff1a; 从键盘输入一个小于10的正整数n&#xff0c;计算1121231234……&#xff0c;即前n项之和。 第一眼看到题目&#xff0c;直觉告诉我必须使用嵌套的两个for循环&#xff0c;里面的循环生成每一项&#xff0c;外面的循环求和。错误的方向和思路让我…

[C++ QT项目实战]----C++ QT系统实现多线程通信

前言 在C QT中&#xff0c;多线程通信原理主要涉及到信号与槽机制和事件循环机制。 1、信号与槽机制&#xff1a; 在QT中&#xff0c;信号与槽是一种用于对象间通信的机制。对象可以通过发送信号来通知其他对象&#xff0c;其他对象通过连接槽来接收信号并进行相应的处…

与 Apollo 共创生态:Apollo 七周年大会给带来的震撼

文章目录 一、七年蛰伏&#xff0c;Apollo 迎来“智变”时刻二、Apollo 企业生态计划与开放平台2.1 Apollo X 企业自动驾驶解决方案2.2 Apollo 开放平台携手伙伴共创生态 三、个人感悟 一、七年蛰伏&#xff0c;Apollo 迎来“智变”时刻 让我们把时间倒回到 2013 年&#xff0…

OpenHarmony语言基础类库【@ohos.util.LightWeightMap (非线性容器LightWeightMap)】

LightWeightMap可用于存储具有关联关系的key-value键值对集合&#xff0c;存储元素中key值唯一&#xff0c;每个key对应一个value。 LightWeightMap依据泛型定义&#xff0c;采用轻量级结构&#xff0c;初始默认容量大小为8&#xff0c;每次扩容大小为原始容量的两倍。 集合中…

C++中的queue(容器适配器)

目录 一、成员函数 一、构造函数 二、入栈 push 三、出栈 pop 四、判空 empty 五、队列大小 size 六、取队头元素 front 七、取队尾元素 back 八、入栈 emplace 九、交换函数 swap 二、非成员函数重载 一、关系运算符重载 二、交换函数 swap C中的queue不再是容…

pytest-xdist:远程多主机 - 分布式运行自动化测试

简介&#xff1a;pytest-xdist插件使用新的测试执行模式扩展了pytest&#xff0c;最常用的是在多个CPU之间分发测试以加快测试执行&#xff0c;即 pytest -n auto同时也是一个非常优秀的分布式测试插件&#xff0c;分别支持ssh和socket两种方式实现master和worker的远程通讯。…

Java8 Stream常见用法

Stream流的常见用法&#xff1a; 1.利用stream流特性把数组转list集合 //定义一个数组Integer[] array {5,2,1,6,4,3};//通过stream特性把数组转list集合List<Integer> list Arrays.stream(array).collect(Collectors.toList());//打印结果System.out.println(list);…