Paimon Branch --- 流批一体化之二

Branch是什么?

可以理解为是git的分支,分为主分支、dev分支等等,而最后读取的时候就相当于是分支的一个merge合并

在流式数据处理中,数据可能因为乱序等问题,存在不准确的情况,这是实时的通病,而实时修正数据存在困难,那么为了解决这个补数的情况,因此Paimon推出了Branch分支机制。

假设现有工作流处理的分支为"主分支",通过创建自定义数据分支,可在不停止现有读写工作流且无需复制主分支数据的前提下,对现有表进行新任务的实验测试与数据验证。

借助合并或替换分支操作,即可完成数据修正工作。

(1) Branch的创建和删除

首先需要创建branch,Paimon支持从特定标签创建分支,或直接创建空分支------这意味着创建的分支初始状态如同空白表格。

sql 复制代码
-- 从tag1中对table1创建test-branch分支
CALL sys.create_branch('default.table1', 'test-branch', 'tag1');

-- 直接对table2创建一个空的tese-branch2分支
CALL sys.create_branch('default.table2', 'test-branch2');

-- 删除指定branch
CALL sys.delete_branch('default.table3', 'branch1');

(2) Branch的使用 -- 读写

默认Branch分支是main,并且Branch有默认的前缀是branch_

因此,如果我们想读写特定的Branch,有2种方式

<1> 方式一:sql就指定好,读写那个Branch

sql 复制代码
-- 对表t从Branch为test-branch去读数据
SELECT * FROM `t$branch_test-branch`; -- 批
SELECT * FROM `t$branch_test-branch` /*+ OPTIONS('consumer-id' = 'myid') */; -- 流

-- 往表t的test2分支去写
INSERT INTO `t$branch_test2` 
SELECT ...

<2> 方式二:采用Fallback Branch -- 流批一体之二

这个原理就是:设置为fallback分支后, 当查询/写入的分区在主分支不存在时,paimon reader会从scan.fallback-branch指定的分支去进行操作

因此,就可以针对流批一体做一些操作,比如离线的批数据正常写入到昨日的分区中,而实时数据写到今日的Fallback Branch分支的分区中

案例如下:

sql 复制代码
-- 1.创建一个T表,按照dt分区
CREATE TABLE T (
    dt STRING NOT NULL,
    name STRING NOT NULL,
    amount BIGINT
) PARTITIONED BY (dt);

-- 2.为流处理创建一个Branch,叫test
CALL sys.create_branch('default.T', 'test');

-- 3.对test分支进行修改属性
ALTER TABLE `T$branch_test` SET (
    'primary-key' = 'dt,name',
    'bucket' = '2',
    'changelog-producer' = 'lookup'
);

-- 4.设置Fallback Branch 为 test分支
ALTER TABLE T SET (
    'scan.fallback-branch' = 'test'
);

-- 5.流式写入,写入到T表的test分支的20240726分区中
(这里如果全部都是20250726分区的数据,那么也可以不写$branch_test,因为T表是没有20240726分区的,会去Fallback Branch分支中操作,但是建议是带上$branch_test)
INSERT INTO `T$branch_test` VALUES ('20240725', 'apple', 4), ('20240725', 'peach', 10), ('20240726', 'cherry', 3), ('20240726', 'pear', 6);

-- 6.批式写入T的主分支
INSERT INTO T VALUES ('20240725', 'apple', 5), ('20240725', 'banana', 7);

-- 7.查表的时候,引擎会合并Branch分支的数据,因此查询,是能查到20240726分区的数据的
-- 合并的逻辑是main没有的分区,从Fallback Branch中拿数据,main有的分区,从main拿
SELECT * FROM T;
/*
+------------------+------------------+--------+
|               dt |             name | amount |
+------------------+------------------+--------+
|         20240725 |            apple |      5 |
|         20240725 |           banana |      7 |
|         20240726 |           cherry |      3 |
|         20240726 |             pear |      6 |
+------------------+------------------+--------+
*/

-- 重置fallback branch
ALTER TABLE T RESET ( 'scan.fallback-branch' );

-- 这样读的话,就只能读main主分支的数据了
SELECT * FROM T;
/*
+------------------+------------------+--------+
|               dt |             name | amount |
+------------------+------------------+--------+
|         20240725 |            apple |      5 |
|         20240725 |           banana |      7 |
+------------------+------------------+--------+
*/

(3) 总结

针对实时数据不准确,需要补数,修改的操作,传统做法是离线覆盖实时昨日,分别落两个表,维护两套系统,这对开发而已是很浪费资源的问题,因此,Paimon推出了Branch操作,去实现一套sql一张表,不同的Branch去存实时和离线的数据,互相不影响,查询的时候又能既查出实时的,也查出离线的

方案就是:

  1. 离线跑main主分支,直接insert overwrite/into
  2. 实时的跑Fallback Branch指定分支,只能insert into
  3. 查询时,Paimon reader会去合并:优先读取主分支(main)的分区数据;如果 main 分支没有该分区,才从 Fallback Branch 读取该分区的补充数据
相关推荐
幌才_loong42 分钟前
.NET 8 实时推送魔法:SSE 让数据 “主动跑” 到客户端
后端
00后程序员1 小时前
如何解决浏览器HTTPS不安全连接警告及SSL证书问题
后端
00后程序员1 小时前
苹果App上架审核延迟7工作日无反应:如何通过App Store Connect和邮件询问进度
后端
DS小龙哥1 小时前
基于物联网设计的蜂箱智能监测系统设计
后端
QZQ541881 小时前
C++编译期计算
后端
饕餮争锋1 小时前
Spring内置的Bean作用域介绍
java·后端·spring
CryptoRzz1 小时前
美股 (US) 与 墨西哥 (Mexico) 股票数据接口集成指南
后端
天远云服1 小时前
高并发风控实践:AES 加密与银行卡风险标签清洗的 Go 语言实现
大数据·api
无级程序员1 小时前
datasophon中dolpinscheduler的自定义配置common.properties不生效问题解决
大数据