Apache Paimon 流式湖仓介绍说明

news2024/11/22 13:20:57


文章目录

  • 前言
  • 选择 Paimon 的原因
  • Apache Paimon 功能
    • 一致性保证
    • Paimon 表类型
    • 数据湖写入
    • 标签和时间线回溯
    • 捕获变更数据写入数据湖
    • LSM 和分层文件重用
    • 流处理案例
    • 使用 Paimon 作为消息队列

前言

Apache Flink 自诞生以来经历了重大演变,如今,它不仅充当批处理和流数据处理的统一引擎,而且为迈向新时代铺平了道路:流式数据湖。
Apache Flink 的概念是动态表,与数据库中的物化视图类似,但是,动态表不能直接查询,因此社区提出使用中间表进行查询,就演变出了 Paimon。

选择 Paimon 的原因

为 Apache Flink 提供利用表格式的存储层,以便可以直接访问动态表中的中间数据的方式被称为 Lakehouse 的存储设计,已经成为了业界数据湖的标准。它将对象存储的廉价性与数仓的可扩展性和优化过查询的特性相结合,目前比较出名的有 Apache Iceberg, Delta Lake 和 Apache Hudi。
社区之所以重新创建一个 Paimon 项目,是因为 Paimon 是和 Flink 原生相结合的,可以和 FLink CDC 天然适配。
流式数据湖需要支持一下特性:

  • 数据的快速写入
  • 变更数据同步更新
  • 高效的实时数据分析

而 Paimon 可以提供以下核心功能:

  • 统一批处理和流处理: Paimon 支持批量读取和写入,以及流式写入变更数据和流式读取表 changelogs。
  • 数据湖作为数据湖存储,Paimon 具有以下优势:低成本、高可靠性、可扩展的元数据。
  • merge 引擎: Paimon支持丰富的合并引擎, 默认情况下,保留主键的最后一项。还可以使用“部分更新”或“聚合”引擎。
  • Changelog 生成器: Paimon 支持丰富的 Changelog 生成器,例如“lookup”和“full-compaction”。正确的变更日志可以简化流管道的构建。
  • Append Only Tables: Paimon支持Append Only表,自动压缩小文件,并提供有序的流读取。可以使用它来替换消息队列。

所有这些特性使 Lakehouse 能够以流优先设计的方式发展,从而产生了Streamhouseimage.png
Streamhouse 架构结合了用于流处理的 Apache Flink 和作为流存储层的 Apache Paimon。
Streamhouse 的核心思想是使用一行语句以一种轻松简单的方式,将来自 CDC 的 ETL 的数据或者日志数据,以流式传输的方式加载至廉价的对象存储中。
当数据进入数据湖时,用户可以创建不同的作业来创建不同的业务层 - 即 ODS、DWD、DWS 和 ADS - 在数据流动时负责更新。
同时,因为数据湖中的数据可以直接访问,我们可以在上层应用中添加任何想要的查询引擎——OLAP 系统(如 Apache Doris 和 StarRocks)或查询引擎(如 Flink SQL、Spark、Trino 或 Hive)—— 来运行批量或增量查询动态表快照的任务。

Apache Paimon 功能

我们需要先了解一些 Paimon 的基本概念,才能更好的理解 Paimon 功能:
快照

  • 快照捕获表在某个时间点的状态。用户可以通过最新的快照访问表的最新数据,并利用时间线回溯通过较早的快照访问表的先前状态。

分区

  • Paimon 采用与 Apache Hive 相同的分区概念来分离数据。
  • 分区是一种可选方法,可根据日期、城市和部门等特定列的值将表划分为相关部分。每个表可以有一个或多个分区键来标识特定分区。
  • 通过分区,用户可以高效地操作表中的一片记录。

  • 未分区表或分区表中的分区被细分为存储桶,为数据提供额外的结构,以便更有效地查询。
  • 桶是读写的最小存储单元,因此桶的数量决定了最大处理并行度。

一致性保证

Paimon 写入使用两阶段提交协议以原子方式将一批记录提交到表中,每次提交最多产生两个快照。
对于任意多个同时修改表的写入任务,只要不修改同一个桶,任务可以并行提交写入数据。如果修改同一个桶,则仅保证快照隔离。最终表状态可能是两次提交的混合结果,但不会丢失任何更改。
Paimon 使用快照提供对任何表的不同版本的访问,并将数据文件分组到分区和存储桶中,并保证一致性。
它利用了一个LSM(Log-Structured Merge Tree)数据结构实现流数据的性能。每个存储桶基本上包含一个 LSM 树及其变更日志文件。
下图显示了 Paimon 的文件布局以及所有文件内容是如何组合在一起:
image.png

Paimon 表类型

主键表
这是一个基本的 cahngelog 表,默认表类型,用户可以在表中插入更新删除记录。
主键由一组包含每个记录的唯一值的列组成,Paimon 通过对每个存储桶内的主键进行排序来强制数据排序,允许用户通过对主键应用过滤条件来实现高性能查询。
由于该表用于存储changelogs 流,因此当具有相同主键的两个或多个记录到达时, Paimon 提供各种 Merge 引擎。

仅追加表
仅追加表是没有主键的表。该表只允许插入操作。不支持删除更新操作。此类表适合不需要更新的用例,例如日志数据同步。

外部日志系统
除了上述的表类型之外,Paimon 还支持外部日志系统。当使用外部日志系统并将数据写入数据湖时,数据也会写入到Kafka等系统中。如果使用外部日志系统,表文件和日志系统会记录所有写入,但流式查询产生的更改将来自日志系统而不是表文件。

数据湖写入

掌握了一些核心概念后,让我们换个角度来看看 Apache Paimon 的核心功能。
image.png
正如已经提到的,Paimon 通过利用分区和存储桶将数据写入数据湖,其中每个存储桶都包含一个 LSM 树。写入数据时,它允许创建标签(我们将在稍后详细解释),并且 LSM 分层结构允许文件重用,以优化性能并减少许多文件的创建。与其他架构相比,它不需要定义分区表,只需要一个主键。
这些表可以低延迟地实时流式传输,并允许实时查询、批量查询和增量查询。数据湖写入的参数调整具有很大的灵活性,允许用户在写入性能、查询性能和存储放大之间取得平衡。
例如,当知道任务执行存在资源压力时,可以选择Paimon的动态桶模式或设置合适的桶大小。如果资源压力持续存在,可以调整 checkpoint 间隔,或调整 Paimon 压缩参数,这样就不会阻塞,并确保更好的写入性能。
总体而言,Paimon 的可配置性很高,允许用户根据流式读取、批量读取和更新场景进行权衡。

标签和时间线回溯

Apache Paimon 利用标签的概念来允许访问不同的离线视图。离线视图基本上是表在某个时间点的快照,允许历史数据查询。标签允许用户及时回溯到表的先前版本。
标签可以自动创建和过期,并且基于快照。该标签将维护快照的清单和数据文件。

以下代码片段演示了在创建表时,用户可以指定自动创建的标签,例如每天生成一个标签,标签过期时间90天:

CREATE TABLE MyTable (
  id INT PRIMARY KEY NOT ENFORCED,
  ...
) WITH (
  'tag.automatic-creation' 	= 'processing-time',
  'tag.creation-period'		= 'daily',
  'tag.creation-delay'		= '10 m',
  'tag.num-retained-max'		= '90'
);

INSERT INTO MyTable SELECT * FROM kafkaTable;

-- Read latest snapshot
SELECT * FROM MyTable;

-- Read Tag snapshot
SELECT * FROM MyTable VERSION AS OF '2023-07-26';

-- Read Incremental data between Tags
SELECT * FROM MyTable paimon_incremental_query ('2023-07-25', '2023-07-26');

当在快照上创建这些标签时,它们将一直保留到过期策略生效(如果指定)。

捕获变更数据写入数据湖

Apache Paimon 最重要的功能之一是捕获变更数据写入数据湖,Paimon 集成了Flink CDC, 支持多种数据源的变更数据捕获。
image.png
一般在捕获变更数据写入时,很难同时从大型表中读取历史数据以及增量变更数据。
同时,我们需要一种增量读取大表的方法,并且当数据库包含数百或数千个表时,最大限度地减少与数据库的连接,才不会给系统带来太大压力。
Flink CDC 可以利用项目独有的增量快照算法来实现这一目标:
image.png
它读取历史数据,然后在不锁定数据库的情况下自动从Binlog中继续读取增量更改。如图所示,增量快照算法允许将大表分割成更小的块并并行读取它们。当自动切换发生时,只需要一项任务来读取增量变化。
目前 Paimon 已经支持 MySQL 和 MongoDB, Kafka 的 CDC。

LSM 和分层文件重用

接下来我们看一下Paimon LSM文件存储的复用:
image.png
Paimon 利用 LSM(日志结构化合并树)进行文件存储,并使用类似于 RocksDB 的分级压缩。 LSM数据结构的一个特点是,当增量数据到达时,并不一定需要合并到下层。
这允许较低级别的文件在两个标签之间重用,因为它们并不会总是受到压缩的影响。

流处理案例

Paimon 有三种流连接方式,双流连接、查询连接和增量更新(利用序列组):
image.png
双流连接要求流连接查询的两侧都保存在内存中,当状态变得太大时,运行连接的成本也会增加。 Paimon 一般直接从数据湖存储中查询数据。
Lookup Join允许通过 Flink Lookup Join 执行 Paimon 表的查找。使用查找连接时要记住的一件事是,更新维度表时,更改不会反映到下游。
部分增量更新 使用Sequence-Groups,使每个字段能够使用不同的更新方法,并且还支持各种合并引擎。它提供高吞吐量和近实时级别的延迟。
例如,假设 Paimon 收到三个记录:

  • <1, 23.0, 10, NULL>
  • <1,NULL,NULL,‘这是一本书’>
  • <1、25.2、NULL、NULL>

假设第一列为主键,则最终结果为:
<1, 25.2, 10, ‘这是一本书’>

使用 Paimon 作为消息队列

image.png
由于Paimon是面向实时处理的,所以有人难免会比较Paimon和Kafka架构,毕竟 Paimon在这方面也做了很多工作。
例如,它支持Append-only表,允许创建没有主键的表,只指定桶号。
桶类似于 Kafka 中的分区,它们提供严格的顺序保存,与Kafka的消息排序相同,但它们也支持Watermarks和Watermark对齐。同时,还支持Consumer ID。
写入过程中,可以自动合并小文件。
因此,从上图可以看出,其整体架构允许用户在某些用例下用Paimon替换Kafka。
Kafka 的真正能力是提供秒级的延迟。当业务用例不需要秒级延迟时,可以考虑使用Paimon来实现消息队列功能。
Apache Paimon 通常以分钟级延迟运行,因为写入数据湖取决于checkpoint 间隔。建议的checkpoint 间隔通常为一分钟,以避免生成许多影响查询性能的小文件。

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

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

相关文章

银河麒麟高级服务器操作系统adb读写缓慢问题分析

1.问题环境 处理器&#xff1a; HUAWEI Kunpeng 920 5251K 内存&#xff1a; 512 GiB 整机类型/架构&#xff1a; TaiShan 200K (Model 2280K) BIOS版本&#xff1a; Byosoft Corp. 1.81.K 内核版本 4.19.90-23.15.v2101.ky10.aarch64 第三方应用 数据库 2.问题…

关于centos8自带的apache2.4开启https后,XP系统的IE8无法显示网页的问题

经检验&#xff0c;是因为系统的apache和openssl版本太高导致的。 禁用系统默认的apache2.4&#xff0c;自己重新源码编译安装一套openssl-1.0.1fapache2.2.23php7.1.2即可。跟update-crypto-policies没有关系&#xff0c;可保持默认的DEFAULT状态。 关于centos8自带的apache2…

2.SG90舵机模块

当我们输出一段脉冲信号的时候就可以调节舵机的角度 我们可以从原理图可以看到舵机的脚在PA6 从芯片手册我们又可以看到PA6对应TIM3_CH1,并且不用开启部分重映像就能使用 新建Servo.c存放PWM初始化 配置PWM void Servo_TIM3_Init(u16 arr,u16 psc) {//开启TIM3的时钟RCC_APB1…

简单粗暴解决 wampapache 突然无法启动错误1053

问题是因为没有安装:vc_redist_x64 导致的 全网最简单粗暴解决下 DirectX_v4.1修复

pyqt QToolBar 选中高亮

目录 效果图 示例代码 效果图 示例代码 from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QToolBar, QToolButtonclass HighlightingToolButton(QToolButton):def __init__(self, parentNone):super().__init__(parent)self.setCheckable(True)def nextChe…

在centos8.5上迁移深度学习环境的时候碰到的一下问题(需要运维人员解决的)

我负责的是将开发服务器上的深度学习环境进行打包并将该环境迁移到生产服务器上&#xff0c;这些操作可以在其他博客中搜到 本文主要介绍我把环境包上传至生产服务器中的anaconda/envs/路径下&#xff0c;解压之后&#xff0c;运行测试代码时遇到的问题 IT部门是如何处理的&am…

servlet的三个重要的类(httpServlet 、httpServletRequst、 httpServletResponse)

一、httpServlet 写一个servlet代码一般都是要继承httpServlet 这个类&#xff0c;然后重写里面的方法 但是它有一个特点&#xff0c;根据之前写的代码&#xff0c;我们发现好像没有写main方法也能正常执行。 原因是&#xff1a;这个代码不是直接运行的&#xff0c;而是放到…

hive使用sqoop与oracle传输数据

下载地址 http://archive.apache.org/dist/sqoop 两个版本sqoop1&#xff08;1.4.x&#xff09;和sqoop2&#xff08;1.99.x&#xff09;&#xff0c;两种不同的架构。 本文使用sqoop1。 sqoop是apache旗下一款“hadoop与关系数据库之间传送数据”的工具。 导入数据&#xf…

比特币减半:挑战与机遇

比特币减半是加密货币领域中一件备受关注的大事&#xff0c;它不仅影响着比特币本身的发展&#xff0c;也深刻影响着整个加密货币市场的走势。在这个历史性时刻&#xff0c;我们有必要深入分析比特币减半带来的挑战与机遇&#xff0c;以及未来的加密货币发展趋势。 挑战&#x…

如何配置STM32的UART/USART接口?

配置STM32的UART/USART接口是实现串行通信的基础。以下是详细的配置步骤和示例代码。 1. 选择时钟源 首先&#xff0c;需要确保USART接口的时钟已经使能。通常&#xff0c;这在初始化代码中完成&#xff0c;或者通过STM32CubeMX工具进行配置。 // 假设USART2位于APB1总线上 …

告别Elementor Pro,无需下载,全新中文版的国产替代方案来袭

如果你正在考虑创建自己的网站&#xff0c;那么在第一次谷歌搜索时&#xff0c;你可能已经看到了WordPress、Elementor和网站构建器这些专业名称。WordPress是最受欢迎的网站平台之一&#xff0c;这不难理解&#xff1a;它高度可定制&#xff0c;易于学习&#xff0c;而且是免费…

市场复盘总结 20240415

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率 0% 最常用的…

服务器负载均衡SLB/加密原理

多台服务器提供相同的服务 SLB(server load balancing) 多台服务器对应一个虚拟地址&#xff0c;该地址是防火墙虚拟出来的。 服务器负载均衡功能仅支持IPV4协议 多通道协议仅支持FTP协议

k8s高可用集群部署介绍 -- 理论

部署官网参考文档 负载均衡参考 官网两种部署模式拓扑图和介绍 介绍两种高可用模式 堆叠 拓扑图如下&#xff08;图片来自k8s官网&#xff09;&#xff1a; 特点&#xff1a;将etcd数据库作为控制平台的一员&#xff0c;由于etcd的共识算法&#xff0c;所以集群最少为3个&…

【面试经典 150 | 数学】阶乘后的零

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;数学优化计算 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结…

Github copilot我用正版登录授权的,来体验一下吧

Github copilot 市面上的那种可以说是破解的&#xff0c;不是代码补全不稳定&#xff0c;就是chat不稳定&#xff0c;反正就是不怎样&#xff01; 下面是官网正版开通的&#xff0c;欢迎体验15天 体验地址&#xff1a;https://www.bilibili.com/read/cv33696436 这种copilo…

zabbix解析以及安装

目录 zabbix 是什么&#xff1f; zabbix 是什么&#xff1f; ●zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 ●zabbix 能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快…

移动Web学习07-适配单位vw/vh哔哩哔哩移动端vw单位适配案例

1.1、VW相对单位 前面我们已经学习了rem单位 &#xff0c;他是一个相对单位、相对于HTML表格字号大小 VW/VH也是一个相对单位&#xff0c;他是相对于视口的尺寸计算结果 VW&#xff1a;viewport width VH: viewport height <meta name"viewport" content"…

软件设计:UML 模型图总结

1. 相关链接 参考教程&#xff1a; https://sparxsystems.com/resources/tutorials/ https://sparxsystems.com/enterprise_architect_user_guide/15.2/model_domains/whatisuml.html Unified Modeling Language (UML) description, UML diagram examples, tutorials and r…

STM32 MPU配置参数

TXE LEVEL一般只用MPU_TEX_LEVEL0 1 - 1 - 1 -0性能最强&#xff08;TEX - C - B- S&#xff09;. #define MPU_TEX_LEVEL0 ((uint8_t)0x00) #define MPU_TEX_LEVEL1 ((uint8_t)0x01) #define MPU_TEX_LEVEL2 ((uint8_t)0x02) 基于上表进行常用配置 &#xff…