使用 Paimon + StarRocks 极速批流一体湖仓分析

摘要:本文整理自阿里云智能高级开发工程师王日宇,在 Flink Forward Asia 2023 流式湖仓(二)专场的分享。本篇内容主要分为以下四部分:

  1. StarRocks+Paimon 湖仓分析的发展历程
  2. 使用 StarRocks+Paimon 进行湖仓分析主要场景和技术原理
  3. StarRocks+Paimon 湖仓分析能力的性能测试
  4. StarRocks+Paimon 湖仓分析能力的未来规划

一、StarRocks+Paimon 湖仓分析的发展历程

1

StarRocks 的发展主要分为三个阶段:

  • 1.x 版本主要关注性能,性能也是 StarRocks 迅速出圈的立足点,如今在绝大部分外表分析场景,无论是哪种格式,如 Hive、Hudi、Iceberg 等,都可以获得 3-5 倍以上的提升。
  • 2.x 版本主要关注极速统一,StarRocks 真正接入的所有的外表格式都是在 2.x 中进行的。
  • 3.x 版本主要关注湖仓融合的特性。

StarRocks 在三个大版本方向上的发展历程主要分为上下两部分,即底层性能持续优化与湖仓重大特性。

StarRocks 最初是通过极速的性能破圈的,主要包括向量化执行引擎、优秀的 CBO 优化器,以及各种 Runtime Filter 等应用。

StarRocks 1.x 在 2021 年开源时,就支持 Hive、ES 以及 MySQL 外表,还有自身的 StarRocks 外表,也可以做外表关联查询。

StarRocks 2.x 在 StarRocks 湖仓分析领域的重大突破,主要包括以下几点:

  1. 支持Catalog数据目录。在 1.x 时,要查询外表,需要根据对应表创建 External Table,就像普通表一样,指定各种列、类型,但在大数据领域,库和表很多,若要一个个创建外表,运维成本和人工成本很高,不容易维护,因此,在 2.x 中引入 Catalog 目录,只需要指定一个元数据地址,如 Hive Metastore,阿里云上的 DLF 或 AWS Glue,StarRocks 就可以直接根据元数据将所有的库表信息同步过来。
  2. 去年开始发布的 2.x,已经支持数据湖四种类型中的三种,包括 Iceberg、Hudi、Delta Lake ,当时 Paimon 还在孵化中。
  3. 2.x 引入 JNI Connector,最开始是为了解决读取 Hudi 的 MOR 表问题,因为大数据生态基本由 Java 开发,但 StarRocks 的主要语言是 C++,而 C++ 与 Java 之间的交互需要在内存里做数据转换,因此封装抽象 JNI Connector,全面封装所有的 C++ 与 Java 之间的内存转换和通信工作。
  4. 支持外表物化视图。很多使用场景都是基于 StarRocks 物化视图做的。
  5. 支持 Json、Map、Struct、Array 以及其他复杂类型的读取,性能优化也做了很多提升,包括大量 IO 的性能优化,如 Reader 合并、Rowgroup 合并、Data Cache 以及延迟物化。
  6. 对执行引擎进行了较大的改造,支持 Pipeline 执行引擎,使其执行顺序更加流水线,CPU 和 IO 之间有了非常好的平衡。
  7. 支持更加复杂的统计类型,包括直方图。

进入 3.x 时代,StarRocks 的主要突破有:

  1. 引入对 Paimon 数据湖格式的支持,并进一步优化对 JNI Connector 复杂类型的支持。Paimon 也是由 Java 开发的,所以使用了 JNI Connector。
  2. 支持算子落盘的 Spill,为将来使用 StarRocks 直接做 ETL 打基础。ETL 数据量通常比较大,通过 Spill 可以仅使用少量资源,如几个节点,在内存受限的情况下做大规模的数据处理。
  3. 提升 Trino 的兼容性。之前, Presto 或 Trino 与 StarRocks MySQL 语上有一定的区别,如要迁移到 StarRocks,则需要修改 SQL 作业,3.x 引入 Trino 兼容性之后,只需要设置 Session 变量就可以直接把原来的 Trino 作业运行在 StarRocks 上。
  4. 支持物化视图的分区刷新。在这之前都是整表刷新,现在可以自动感知刷新的分区,仅刷新有变化的分区,减少物化视图刷新的资源消耗。
  5. 除读取外,StarRocks 现在还支持 Hive、Iceberg 数据的写入。

二、使用 StarRocks+Paimon 进行湖仓分析主要场景和技术原理

2.1 主要场景

2

  1. trino兼容

    支持 Trino SQL 的关键字、语法和函数转义等。在使用过程中,可以直接 Trino SQL 转换为 StarRocks AST,并生成执行计划,只需要在 StarRocks 中执行语句 set sql_dialect = “trino” 即可启用。这样,所有的作业都可以直接搬到 StarRocks,而无需修改任何一行代码,该特性已在实际生产环境包括合作伙伴、客户案例中正式落地了,目前基本上达到了 90% 以上的兼容性。

3

  1. 联邦分析

    由于不同的业务线使用不同的湖格式,甚至有自己的数据源,所以对于一些复杂查询,需要把不同数据源 join 起来联合查询。以 Paimon 的使用为例,直接 CREATE EXTERNAL CATALOG paimon_fs_catalog,指定地址,即可直接查询 Paimon 数据源表。其他数据格式的表也类似,需要联邦查询的时候,就直接对不同类型的表做 join 即可,包括 StarRocks 内表也是可以跟外表联合查询的。

4

  1. 透明加速

    其主要依赖于物化视图功能,而之所以要做物化视图,是因为 StarRocks 有自己的格式,很多特定的优化都是在自有格式的基础上进行的,这些性能优化都是依赖于特定的索引、特定的存储格式等,都需要 StarRocks 自己管理。使用透明加速,可以利用外表的物化视图功能把一些需要加速的表和分区构建成物化视图做成 StarRocks 自有格式,做到加速查询的效果。如图中右侧案例,建立了一个外表物化视图,join 了三个表,但实际业务中并不对三张表都进行查询,而是可能查询其中某一张表或某两张表,StarRocks 可以自动改写 SQL 命中物化视图进行加速查询,解决了 BI 报表不易修改,SQL 不易调优的痛点,该过程对用户是无感知的。

5

  1. 数据建模

    其依赖于 StarRocks 物化视图的嵌套功能,因为 StarRocks 的物化视图并不是只能针对源表进行加速,它可以在物化视图的基础上再建立物化视图,也就是所谓的嵌套的形式。这与平时数据建模相同,最底层是对象存储,包括 HDFS/OSS/HDFS-OSS,ODS 层在数据湖场景使用的多为湖格式,如 Paimon,之后上面的所有层 DWD、DWS、ADS 都可以继续使用物化视图构建。DWD 是直接的外表物化视图,DWS、ADS 是嵌套物化视图,这样就可以把所有层建立联系起来,使用一套系统完成整个数据建模工作。而且,无论查询哪一层,都可以直接使用物化视图的透明加速功能。

6

  1. 冷热融合

    由于业务每时每刻都在积累数据,但实际上经常需要的仅是查询最近几天或最近几个月的数据,称之为热数据,而更早的、不经常查询的数据称为冷数据。在做数仓时,很多都是按时间进行分区,如天、月、年等。在建立 StarRocks 物化视图时,可以指定一个 TTL,即物化视图的有效时间,如 TTL = 3 months 表示对最近三个月的分区做物化,其余分区不做物化,所有的过程都是自动的,这样,冷数据就可以在廉价的 OSS 存储中存较长的时间,热数据在 StarRocks 里加速查询。当然,并不是所有的作业都只查询热数据,还要查询冷数据。业务编写 SQL 时也无需关心是冷数据,还是热数据,如指定查询五个月的数据,以 TTL = 3 months 为例,StarRocks 会自动将三个月的数据直接从物化视图里读取,剩余两个月的数据再到外表中查,用户无需感知物化视图的存在,就像正常查询一样写外表查询语句就可以。

2.2 技术原理

7

JNI Connector是阿里云团队 2022 年为社区贡献的重大的 Feature 之一。现在不但支持 Paimon,还有 Hudi,AVRO,RCFile 等多种格式。因为 StarRocks 的 BE 端是用 C++ 编写的,而所有的湖格式都是用 Java 编写的,JNI Connector 可以将 C++ Memory 和 Java Memory 转换过程封装起来。在此之前,需要对每个新格式都写一层 JNI 程序,JNI 比较难调试,工作量也会很大。JNI Connector 将所有通用的功能抽取出来,并暴露了三个 Java Reader 接口,即 open、getNext 和 close。在对接新格式时,只需要编写一段 Java 代码,实现这三个接口,再告知 JNI Connector 一些基础和必要信息即可,剩余的各种字段类型的转换,或 String、int 等各种内存之间转换,都会自动完成。JNI Connector 的主要目的就是快速接入各类 Java 数据源,方便开发者编程。如今,JNI Connector 已经支持了很多格式,从最初支持的 Hudi MOR Table 扩展到现在的 Paimon Table、AVR0、Sequence、RCfile,也支持所有的复杂类型,包括 Struct、Map、Array 等。接入新数据源可以实现 BE 代码的零侵入,不需要考虑 C++ 的具体实现。

具体的内存转化原理及过程:

8

核心原理是,在 Java 堆外内存,针对不同字段类型,参考 StarRocks 在 BE 存储的布局,将数据在 Java 中构造起来。比如,对于 int 字段这类的定长字段(4个字节),其在 BE 中就是按顺序排开存储的,还有 Null indicator 用来指定对应行是否是 null,如果是 null,则无需读取,如果不是 null,再进行读取4个字节,每个 indicator 是一个 byte。这样在 Java 的堆外内存里,按照这样的布局构造之后,在 BE 端直接调用 memory copy 就可以把块内存直接给 C++ 用。

比较特殊的是有变长字段,变长字段比定长字段多了 offset indicator,因为变长字段无法提前知道每一行字段的长度,需要使用 offset indicator 存储每个字段的起始地址,如第一个字段起始地址是 offset 0,第二个字段的起始地址 offset 1,则第一个数据的总长度为 offset 1 - offset 0 +1。下面给出了两个链接,包括最新 Paimon 读取、Hudi MOR 读取支持的实现。

三、StarRocks+Paimon 湖仓分析能力的性能测试

9

  1. 测试环境:
    测试环境 EMR 版本是 EMR-5.15.1,1 个 master 节点,3 个 core 节点,配置都相同,都是 16 vCPU 64 GiB,Trino 版本是两个月前新出的 422 版本,StarRocks 版本是 main 分支。

  2. 测试软件配置:
    测试软件的配置仅修改了内存,因为内存机器是 64 GiB,把 Trino 改为 -Xmx50G, StarRocks 也使用 -Xmx50G。

  3. 测试步骤:
    测试 TPCH 100G,每个 query 都测试 3 次,取平均值,不做任何提前 analyze, 不做预热,数据放在 HDFS 上。

  4. 测试结果:
    观察图表,可以发现对比特别明显,在 StarRocks 内核优化以及 Paimon 两个团队的共同努力下,其查询性能是上一版本的 15 倍。

四、StarRocks+Paimon 湖仓分析能力的未来规划

10

  1. 支持系统表的查询:
    Paimon 中有一些系统表,其本身也有很多元数据,如 snapshot、files、tugs 等都是通过系统表提供的,接下来会支持基础的系统表查询。

  2. 支持 time travel 和 snapshot 查询:
    数据回溯能力。

  3. 支持 Paimon 外表的 sink 能力:
    通过 StarRocks 写 Paimon 外表。

  4. 优化 date/datetime 类型的处理效率:
    这属于 JNI Connector 的范畴,因为现在读取 Paimon 是通过 JNI Connector 进行的,JNI Connector 如今要处理 date/datetime 中间要经过一层 string 转化,其仍旧占用了一部分不必要的开销。

  5. 接入 unified catalog:
    如果查 Hive,则要建 Hive catalog;如果要查 Paimon,则要建 Paimon catalog;需要建两个 catalog,虽然可以联邦查询进行撞义,但用户体验感不佳,接入 unified catalog 后,即使很多用户库中不仅有一种类型的表,都可以只建一个 catalog 即可。

  6. 使用元数据缓存加速查询:
    现在所有 FE 处理 Paimon 时都没有进行元数据缓存,元数据缓存可以减少很多 IO 请求,实现加速。

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

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

相关文章

RPC教程 7.服务发现与注册中心

0.前言 这一节的内容只能解决只有一个服务的情况。要是有多个服务(即是多个结构体)这种就解决不了,也即是没有服务ip地址和服务实例的映射关系。 1.为什么需要注册中心 在上一节中,客户端想要找到服务实例的ip,需要硬编码把ip写到代码中。…

如何将Mac连接到以太网?这里有详细步骤

在Wi-Fi成为最流行、最简单的互联网连接方式之前,每台Mac和电脑都使用以太网电缆连接。这是Mac可用端口的标准功能。 如何将Mac连接到以太网 如果你的Mac有以太网端口,则需要以太网电缆: 1、将电缆一端接入互联网端口(可以在墙…

IDEA2023打开新项目默认SDK变成了17

问题描述 项目安装了2个sdk版本,jdk8和jdk17 自从升级IDEA版本到2023以后,每次打开新项目,sdk都被默认选择成了jdk17, 每次都得手动修改 (File--Project Structure),超级麻烦。 没有用的解决方法 以下这…

正则表达式与文本三剑客

目录 一、正则表达式 1. 定义 2. 字符匹配 3. 重复限定符 4. 位置锚点 5. 分组和引用 6. 扩展正则表达式 二、文本三剑客 1. grep 1.1 定义 1.2 语法 1.3 选项 1.4 示例 2. sed 2.1 定义 2.2 通式 2.3 选项 2.4 脚本格式(脚本语法) 2.…

Backtrader 文档学习- Broker - Cheat-On-Open

Backtrader 文档学习- Broker - Cheat-On-Open 1.概述 V1.9.44.116增加了Cheat On Open的支持。对于全押的人来说,这似乎是一个必需的功能,用bar的收盘价后进行计算,希望与开盘价相匹配。 当开盘价差距(上涨或下跌,取…

DjangoURL调度器(二)

一、默认值与额外参数 1.1、默认值 1.1.1、urls.py from django.urls import pathfrom . import viewsurlpatterns [# http://127.0.0.1:8000/polls/blog/ 等同于 # http://127.0.0.1:8000/polls/blog/1/path(blog/, views.page),# http://127.0.0.1:8000/polls/blo…

BSV区块链将凭借Teranode的创新在2024年大放异彩

​​发表时间:2024年1月15日 2024年1月15日,瑞士楚格 – BSV区块链协会研发团队今日官宣了Teranode的突破性功能,这些功能将显著提升BSV区块链网络的效率和速度。在不久的将来,BSV区块链的交易处理能力将达到每秒100万笔交易。 T…

怎么备份ESXi虚拟机?

ESXI备份虚拟机与快照的区别是什么? 关于虚拟机备份的一个常见误解是它与虚拟机快照有何不同以及它们是否可以相互替代?为了回答这个问题,让我们仔细看看这两个概念: VM虚拟机快照:快照(或Hyper-V 的检查…

神经网络的一些常规概念

epoch:是指所有样本数据在神经网络训练一次(单次epoch(全部训练样本/batchsize)/iteration1)或者(1个epochiteration数 batchsize数) batch-size:顾名思义就是批次大小,也就是一次训练选取的样…

网络安全03---Nginx 解析漏洞复现

目录 一、准备环境 二、实验开始 2.1上传压缩包并解压 2.2进入目录,开始制作镜像 2.3可能会受之前环境影响,删除即可 ​编辑 2.4制作成功结果 2.5我们的环境一个nginx一个php 2.6访问漏洞 2.7漏洞触发结果 2.8上传代码不存在漏洞 2.9补充&#…

Log4j2-29-log4j2 discard policy 极端情况下的丢弃策略 同步+异步配置的例子

Log4j2异步日志、同步日志和混合日志的配置详解 Log4j 2中记录日志的方式有同步日志和异步日志两种方式,其中异步日志又可分为使用AsyncAppender和使用AsyncLogger两种方式。 异步日志(性能最好,推荐使用) 异步日志情况下,增加 Disruptor …

深入浅出HBase:一文理解HBase基础概念(列存储、时间戳、key-value)、架构特点以及适合的使用场景

文章目录 一. HBase 数据模型1. 行存储与列式存储1.1. 行存储1.2. 列存储 2. HBase 数据模型2.1. 模型概览2.2. 列与列族2.3. 时间戳:定义数据版本2.4. HBase的Key-Value 三. HBase架构1. HBase读写流程简述2. HRegionServer内部内部数据流转:HRegion &l…

Web性能优化之如何评估网页性能——性能指标和度量工具介绍

前言 用户在访问 web 网页时,大部分都希望网页能够在一秒完成。事实上,加载时间每多 1 秒,就会流失 7%的用户。如果时间超过 8s 用户就会感到不耐烦、会放弃访问。这也就是著名的 “8秒原则”。 虽然当今设备及网络环境都大幅提升&#xff…

【Spark系列3】RDD源码解析实战

本文主要讲 1、什么是RDD 2、RDD是如何从数据中构建 一、什么是RDD? RDD:弹性分布式数据集,Resillient Distributed Dataset的缩写。 个人理解:RDD是一个容错的、并行的数据结构,可以让用户显式的将数据存储到磁盘…

DVI接口如何连接HDMI接口显示器?DVI转HDMI转换器DHA

DVI转HDMI转换器DHA简介 DVI转HDMI转换器DHA能够将DVI信号和R/L音频信号输入转换成HDMI信号输出,独特的功能使其顺畅地整合到家庭影院中,并且播放出高品质的图像。主要用于数据监控中心、大型会议展示中心、学校及各个公司 DVI转HDMI转换器DHA特点 01.支持分辨率4K…

【TCP】三次握手(建立连接)

前言 在网络通信的世界里,可靠传输协议(TCP)扮演着重要的角色,它保证了数据包能够按顺序、完整地从发送端传送到接收端。TCP协议中有一个至关重要的机制——三次握手。这一过程确保了两个TCP设备在开始数据传输之前建立起一个稳定…

内衣洗衣机有必要买吗?最好用的迷你洗衣机推荐

随着内衣洗衣机的流行,很多小伙伴在纠结该不该入手一款内衣洗衣机,专门来洗一些贴身衣物,答案是非常有必要的,因为我们现在市面上的大型洗衣机只能做清洁,无法对我们的贴身衣物进行一个高强度的清洁,而小小…

手写分布式存储系统v0.1版本

引言 这是手写分布式存储系统v0.1版本,只有一个目标就是支持通过tcp接收数据并落地到磁盘文件(单机模式),那接下来就开始吧 设计 实现一个系统,设计是最过瘾的过程没有之一,类似你搭积木前在脑海设计构建一副大致的“雏形”&am…

力扣hot100 最小路径和 多维DP 滚动数组 一题多解

Problem: 64. 最小路径和 文章目录 思路💖 朴素版💖 空间优化版 思路 👨‍🏫 路飞 💖 朴素版 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) 🌎 空间复杂度: O ( n m ) O(nm) O(nm) class Solution {public …

查看Windows 所有账户方法

目标 了解Windows查看所有账户的方法 方法 方法1:本地和用户组 按下Win X键,选择“计算机管理”。在计算机管理界面的左侧面板中,展开“系统工具” -> “本地用户和组” -> “用户”。在右侧窗口中,查看列出的所有用户账…