You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-zh@flink.apache.org by "xueaohui_com@163.com" <xu...@163.com> on 2020/06/18 11:39:28 UTC

Flink 多Sink 数据一致性保证

如上图所示,目前通过把作业加入多个sink,这种场景下面当hbase写入的失败的时候,不影响kakfa的写入。期望hbase写入失败,kafka也不发送。
如何保证hbase和kafka的写入为原子性呢?
不知道flink是否有多sink的二阶段提交方案。



xueaohui_com@163.com

Re: Re: Re: Re: Flink 多Sink 数据一致性保证

Posted by Yun Gao <yu...@aliyun.com.INVALID>.
是的,社区现在正在加exactly-oncer jdbc sink实现[1]。

另外,如果要实现两阶段提交的sink的话,总是需要有能跨session的transaction机制,就是在作业挂了之后,下次起来的时候这个事务还可以abort掉或者继续提交(取决于是否已经snapshot过了)。像jdbc必须要用xa事务,用单纯的jdbc事务应该就是有问题的,因为即使在snapshot的时候precommit过了,如果作业挂掉连接中断这个事务仍然会被abort掉。


[1] https://issues.apache.org/jira/browse/FLINK-15578

------------------------------------------------------------------
Sender:jindy_liu<28...@qq.com>
Date:2020/07/13 10:49:27
Recipient:<us...@flink.apache.org>
Theme:Re: Re: Re: Flink 多Sink 数据一致性保证

原理大概理解了,想自己实现一个。比如kafka与mysql的实现,并想最大程度的复用些代码。
看了下源码,感觉要把现在的connector(kafka,
jdbc)中的代码都看一下,然后扣出来,再去按twophasecommitsinkfunction的实现,重组一些代码,一个个方法实现。
另外问一下,好像现在源码里的jdbc只是at-least-once实现?



--
Sent from: http://apache-flink.147419.n8.nabble.com/

Re: Re: Re: Flink 多Sink 数据一致性保证

Posted by jindy_liu <28...@qq.com>.
原理大概理解了,想自己实现一个。比如kafka与mysql的实现,并想最大程度的复用些代码。
看了下源码,感觉要把现在的connector(kafka,
jdbc)中的代码都看一下,然后扣出来,再去按twophasecommitsinkfunction的实现,重组一些代码,一个个方法实现。
另外问一下,好像现在源码里的jdbc只是at-least-once实现?



--
Sent from: http://apache-flink.147419.n8.nabble.com/

Re: Re: Re: Flink 多Sink 数据一致性保证

Posted by Yun Gao <yu...@aliyun.com.INVALID>.
多个sink如果都按TwoPhaseCommitSinkFunction来做的话,是可以实现多sink一致性的。大体上可以认为只要有一个sink出错,整个作业都会failover,其它sink当前的事务也会跟着abort掉,然后整个作业回退到上一次checkpoint开始执行。


------------------------------------------------------------------
Sender:jindy_liu<28...@qq.com>
Date:2020/07/09 10:55:35
Recipient:<us...@flink.apache.org>
Theme:Re: Re: Flink 多Sink 数据一致性保证

请问下,你这个最后是怎么做到的,能share下源码吗?
是需要将两个sink合并到一个sink里,然后再实现下二阶段提交吗?
我也遇到个多sink的原子性场景。



--
Sent from: http://apache-flink.147419.n8.nabble.com/

Re: Re: Flink 多Sink 数据一致性保证

Posted by jindy_liu <28...@qq.com>.
请问下,你这个最后是怎么做到的,能share下源码吗?
是需要将两个sink合并到一个sink里,然后再实现下二阶段提交吗?
我也遇到个多sink的原子性场景。



--
Sent from: http://apache-flink.147419.n8.nabble.com/

Re: Re: Flink 多Sink 数据一致性保证

Posted by "xueaohui_com@163.com" <xu...@163.com>.
    看了一下 TwoPhaseCommitSinkFunction ,因为我测试的时候是自己写的Sink,没有继承这个Sink去实现,所以是我的问题。谢谢



xueaohui_com@163.com
 
发件人: xueaohui_com@163.com
发送时间: 2020-06-20 09:54
收件人: user-zh
抄送: yungao.gy >
主题: Re: Re: Flink 多Sink 数据一致性保证
Hello: 
     我手动试了一下,一个Sink的抛异常是不会影响另外一个Sink的写入的。
     引用: 按二阶段提交的逻辑,这种情况下kafka这边的事务也会被abort掉,数据不会真正写入。
     这个是需要手动开启吗?



xueaohui_com@163.com
 
发件人: Yunyungao.gy@aliyun.com>Gao
发送时间: 2020-06-19 15:21
收件人: xueaohui_com@163.com; user-zh
主题: Re: Flink 多Sink 数据一致性保证
Hello,
 
    我理解多个sink的情况下,数据保证写入仍然发生在数据写入后的checkpoint完成,如果写入Hbase这边写入失败的时候会触发failover的话,按二阶段提交的逻辑,这种情况下kafka这边的事务也会被abort掉,数据不会真正写入。
 
 
------------------Original Mail ------------------
Sender:xueaohui_com@163.com <xu...@163.com>
Send Date:Thu Jun 18 19:39:46 2020
Recipients:user-zh <us...@flink.apache.org>
Subject:Flink 多Sink 数据一致性保证
 
 
 
如上图所示,目前通过把作业加入多个sink,这种场景下面当hbase写入的失败的时候,不影响kakfa的写入。期望hbase写入失败,kafka也不发送。
如何保证hbase和kafka的写入为原子性呢?
不知道flink是否有多sink的二阶段提交方案。
 
 
 
xueaohui_com@163.com

回复: Re: Flink 多Sink 数据一致性保证

Posted by 胡云川 <hu...@foxmail.com>.
可以讲kafka的sink里面添加一个hbase sink,试一试?把hbase的写入包在kafka的事务中------------------&nbsp;原始邮件&nbsp;------------------
发件人:&nbsp;&quot;xueaohui_com@163.com&quot;<xueaohui_com@163.com&gt;
发送时间:&nbsp;2020年6月20日(星期六) 上午9:54
收件人:&nbsp;&quot;user-zh&quot;<user-zh@flink.apache.org&gt;;
抄送:&nbsp;&quot;yungao.gy &gt;&quot;<yungao.gy@aliyun.com&gt;;
主题:&nbsp;Re: Re: Flink 多Sink 数据一致性保证

Re: Re: Re: Re: Flink 多Sink 数据一致性保证

Posted by Yun Gao <yu...@aliyun.com.INVALID>.
下面这个是一个单独的问题;我想说的是逻辑上hbase写挂导致failover的时候kafka应该会abort掉当前事务,但是反过来kafka写错的时候,hbase这边应该没有办法不写入的,如果按现在的默认实现的话。


------------------------------------------------------------------
Sender:Yun Gao<yu...@aliyun.com.INVALID>
Date:2020/06/20 10:42:23
Recipient:xueaohui_com@163.com<xu...@163.com>; user-zh<us...@flink.apache.org>
Theme:Re: Re: Re: Flink 多Sink 数据一致性保证

hello~,
一个Sink的抛异常是不会影响另外一个Sink的写入的: 这个是指hbase的异常不会影响kafka的写入?hbase的异常有导致failover么?逻辑上如果出现整个作业的failover,kafka的sink也会开始走failover,然后把当前的事务failover掉,然后整个作业回退到上一个checkpoint开始执行。

   不过还有一个问题是现在hbase的sink的写法是?因为hbase默认应该hbase sink function本身应该不是基于两阶段提交的。


此致
    敬礼



 ------------------Original Mail ------------------
Sender:xueaohui_com@163.com <xu...@163.com>
Send Date:Sat Jun 20 09:54:59 2020
Recipients:user-zh <us...@flink.apache.org>
CC:yungao.gy <yu...@aliyun.com>
Subject:Re: Re: Flink 多Sink 数据一致性保证

Hello: 
     我手动试了一下,一个Sink的抛异常是不会影响另外一个Sink的写入的。
引用: 按二阶段提交的逻辑,这种情况下kafka这边的事务也会被abort掉,数据不会真正写入。
     这个是需要手动开启吗?



xueaohui_com@163.com
发件人: Yunyungao.gy@aliyun.com>Gao
发送时间: 2020-06-19 15:21
收件人: xueaohui_com@163.com; user-zh
主题: Re: Flink 多Sink 数据一致性保证
Hello,
    我理解多个sink的情况下,数据保证写入仍然发生在数据写入后的checkpoint完成,如果写入Hbase这边写入失败的时候会触发failover的话,按二阶段提交的逻辑,这种情况下kafka这边的事务也会被abort掉,数据不会真正写入。
 ------------------Original Mail ------------------
Sender:xueaohui_com@163.com <xu...@163.com>
Send Date:Thu Jun 18 19:39:46 2020
Recipients:user-zh <us...@flink.apache.org>
Subject:Flink 多Sink 数据一致性保证
如上图所示,目前通过把作业加入多个sink,这种场景下面当hbase写入的失败的时候,不影响kakfa的写入。期望hbase写入失败,kafka也不发送。
如何保证hbase和kafka的写入为原子性呢?
不知道flink是否有多sink的二阶段提交方案。
xueaohui_com@163.com

Re: Re: Re: Flink 多Sink 数据一致性保证

Posted by Yun Gao <yu...@aliyun.com.INVALID>.
hello~,
一个Sink的抛异常是不会影响另外一个Sink的写入的: 这个是指hbase的异常不会影响kafka的写入?hbase的异常有导致failover么?逻辑上如果出现整个作业的failover,kafka的sink也会开始走failover,然后把当前的事务failover掉,然后整个作业回退到上一个checkpoint开始执行。

   不过还有一个问题是现在hbase的sink的写法是?因为hbase默认应该hbase sink function本身应该不是基于两阶段提交的。


此致
    敬礼



 ------------------Original Mail ------------------
Sender:xueaohui_com@163.com <xu...@163.com>
Send Date:Sat Jun 20 09:54:59 2020
Recipients:user-zh <us...@flink.apache.org>
CC:yungao.gy <yu...@aliyun.com>
Subject:Re: Re: Flink 多Sink 数据一致性保证

Hello: 
     我手动试了一下,一个Sink的抛异常是不会影响另外一个Sink的写入的。
引用: 按二阶段提交的逻辑,这种情况下kafka这边的事务也会被abort掉,数据不会真正写入。
     这个是需要手动开启吗?



xueaohui_com@163.com
发件人: Yunyungao.gy@aliyun.com>Gao
发送时间: 2020-06-19 15:21
收件人: xueaohui_com@163.com; user-zh
主题: Re: Flink 多Sink 数据一致性保证
Hello,
    我理解多个sink的情况下,数据保证写入仍然发生在数据写入后的checkpoint完成,如果写入Hbase这边写入失败的时候会触发failover的话,按二阶段提交的逻辑,这种情况下kafka这边的事务也会被abort掉,数据不会真正写入。
 ------------------Original Mail ------------------
Sender:xueaohui_com@163.com <xu...@163.com>
Send Date:Thu Jun 18 19:39:46 2020
Recipients:user-zh <us...@flink.apache.org>
Subject:Flink 多Sink 数据一致性保证
如上图所示,目前通过把作业加入多个sink,这种场景下面当hbase写入的失败的时候,不影响kakfa的写入。期望hbase写入失败,kafka也不发送。
如何保证hbase和kafka的写入为原子性呢?
不知道flink是否有多sink的二阶段提交方案。
xueaohui_com@163.com

回复:Flink 多Sink 数据一致性保证

Posted by Yichao Yang <10...@qq.com>.
Hi


能不能描述一下你是什么样的场景下才会需要到多sink一致性保证?
可不可以换一下思路,选择只出kafka的数据,然后把kafka数据实时同步hbase。


Best,
Yichao Yang



发自我的iPhone


------------------ 原始邮件 ------------------
发件人: xueaohui_com@163.com <xueaohui_com@163.com&gt;
发送时间: 2020年6月20日 09:55
收件人: user-zh <user-zh@flink.apache.org&gt;
抄送: yungao.gy &gt; <yungao.gy@aliyun.com&gt;
主题: 回复:Flink 多Sink 数据一致性保证



Hello: 
&nbsp;&nbsp;&nbsp;&nbsp; 我手动试了一下,一个Sink的抛异常是不会影响另外一个Sink的写入的。
&nbsp;&nbsp;&nbsp;&nbsp; 引用: 按二阶段提交的逻辑,这种情况下kafka这边的事务也会被abort掉,数据不会真正写入。
&nbsp;&nbsp;&nbsp;&nbsp; 这个是需要手动开启吗?



xueaohui_com@163.com
&nbsp;
发件人: Yunyungao.gy@aliyun.com&gt;Gao
发送时间: 2020-06-19 15:21
收件人: xueaohui_com@163.com; user-zh
主题: Re: Flink 多Sink 数据一致性保证
Hello,
&nbsp;
&nbsp;&nbsp;&nbsp; 我理解多个sink的情况下,数据保证写入仍然发生在数据写入后的checkpoint完成,如果写入Hbase这边写入失败的时候会触发failover的话,按二阶段提交的逻辑,这种情况下kafka这边的事务也会被abort掉,数据不会真正写入。
&nbsp;
&nbsp;
------------------Original Mail ------------------
Sender:xueaohui_com@163.com <xueaohui_com@163.com&gt;
Send Date:Thu Jun 18 19:39:46 2020
Recipients:user-zh <user-zh@flink.apache.org&gt;
Subject:Flink 多Sink 数据一致性保证
&nbsp;
&nbsp;
&nbsp;
如上图所示,目前通过把作业加入多个sink,这种场景下面当hbase写入的失败的时候,不影响kakfa的写入。期望hbase写入失败,kafka也不发送。
如何保证hbase和kafka的写入为原子性呢?
不知道flink是否有多sink的二阶段提交方案。
&nbsp;
&nbsp;
&nbsp;
xueaohui_com@163.com

Re: Re: Flink 多Sink 数据一致性保证

Posted by "xueaohui_com@163.com" <xu...@163.com>.
Hello: 
     我手动试了一下,一个Sink的抛异常是不会影响另外一个Sink的写入的。
     引用: 按二阶段提交的逻辑,这种情况下kafka这边的事务也会被abort掉,数据不会真正写入。
     这个是需要手动开启吗?



xueaohui_com@163.com
 
发件人: Yunyungao.gy@aliyun.com>Gao
发送时间: 2020-06-19 15:21
收件人: xueaohui_com@163.com; user-zh
主题: Re: Flink 多Sink 数据一致性保证
Hello,
 
    我理解多个sink的情况下,数据保证写入仍然发生在数据写入后的checkpoint完成,如果写入Hbase这边写入失败的时候会触发failover的话,按二阶段提交的逻辑,这种情况下kafka这边的事务也会被abort掉,数据不会真正写入。
 
 
------------------Original Mail ------------------
Sender:xueaohui_com@163.com <xu...@163.com>
Send Date:Thu Jun 18 19:39:46 2020
Recipients:user-zh <us...@flink.apache.org>
Subject:Flink 多Sink 数据一致性保证
 
 
 
如上图所示,目前通过把作业加入多个sink,这种场景下面当hbase写入的失败的时候,不影响kakfa的写入。期望hbase写入失败,kafka也不发送。
如何保证hbase和kafka的写入为原子性呢?
不知道flink是否有多sink的二阶段提交方案。
 
 
 
xueaohui_com@163.com

Re: Flink 多Sink 数据一致性保证

Posted by Yun Gao <yu...@aliyun.com.INVALID>.
Hello,

    我理解多个sink的情况下,数据保证写入仍然发生在数据写入后的checkpoint完成,如果写入Hbase这边写入失败的时候会触发failover的话,按二阶段提交的逻辑,这种情况下kafka这边的事务也会被abort掉,数据不会真正写入。


 ------------------Original Mail ------------------
Sender:xueaohui_com@163.com <xu...@163.com>
Send Date:Thu Jun 18 19:39:46 2020
Recipients:user-zh <us...@flink.apache.org>
Subject:Flink 多Sink 数据一致性保证



如上图所示,目前通过把作业加入多个sink,这种场景下面当hbase写入的失败的时候,不影响kakfa的写入。期望hbase写入失败,kafka也不发送。
如何保证hbase和kafka的写入为原子性呢?
不知道flink是否有多sink的二阶段提交方案。



xueaohui_com@163.com