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 读取该分区的补充数据
相关推荐
GetcharZp6 小时前
玩转 Linux 机器视觉:手把手带你搞定 Ubuntu 下海康工业相机 C++ SDK
后端
星星在线10 小时前
MusicFree:一个「All in One」的个人音乐服务器,让听歌回归简单
前端·后端
IT_陈寒10 小时前
Redis的SETNX并发问题让我加了三天班
前端·人工智能·后端
demo007x11 小时前
Docling 文档转换以及技术架构分析
前端·后端·程序员
袋鱼不重12 小时前
我的神奇同事,AI 用多了居然写了个 Open In Codex
前端·后端·ai编程
大树8812 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
用户83562907805112 小时前
使用 Python 操作 Word 内容控件
后端·python
像我这样帅的人丶你还12 小时前
啥? 前端也要会干Java?🛵🛵🛵
后端
Hommy8812 小时前
【剪映小助手】添加贴纸接口(Add Sticker)
后端·github·剪映小助手·视频剪辑自动化·剪映api
大志哥12313 小时前
ES和Logstash日志链路系统上线后遭遇切片爆炸(解决)
大数据·elasticsearch