Hi Eleanore,这个问题我可以提供一点理解作为参考

1.chk与at least once
checkpoint机制的思想就是做全局一致性的快照,失败恢复时数据的消费位点会回滚到上一次chk n的进度,
然后进行数据重放,这样就保证了数据不会缺失,至少被消费一次。

2. sink2PC
在chk机制下,数据重放时一般sink端的数据不能回滚,就会有重复数据。如果是upsert sink那仍然是一致的,
否则需要通过2PC的预提交来将chk n+1成功前的数据写到临时存储,等chk n+1完成再真正写入的物理存储。如果
在chk n+1之前任务失败回滚了,那临时存储的数据也可以回滚,这样就能保证一致性。

这样的话 chk就是at least once,chk+upsert或者chk+2pc就是exactly once了。

3.kafka auto commit
chk快照的state不仅仅是source的offset,还有数据流中各个算子的state,chk机制会在整个数据流完成同一个chk
n的时候才提交offset。
kafka auto commit不能保障这种全局的一致性,因为auto commit是自动的,不会等待整个数据流上同一chk n的完成。

Eleanore Jin <[email protected]> 于2020年8月26日周三 下午11:51写道:

> Hi Benchao
> 可以解释一下为什么sink没有两阶段提交,那就是at least once 的语义吗? 比如source和 sink 都是kafka, 如果 sink
> 不是两段式提交,那么checkpoint 的state 就只是source 的 offset,这种情况下和使用kafka auto commit
> offset 看起来似乎没有什么区别
>
> 可否具体解释一下? 谢谢!
>
> Eleanore
>
> On Tue, Aug 25, 2020 at 9:59 PM Benchao Li <[email protected]> wrote:
>
> > 这种情况需要打开checkpoint来保证数据的不丢。如果sink没有两阶段提交,那就是at least once语义。
> >
> > 范超 <[email protected]> 于2020年8月26日周三 上午11:38写道:
> >
> > > 大家好,我现在有个疑问
> > > 目前我使用kafka作为source,经过计算以后,将结果sink到数据库;
> > >
> > >
> >
> 后来日志数据库发生了timeout或者宕机,kafka这边的主题,却消费掉了造成了数据丢失,那么如何设置才可以确认在sink失败的时候,不提交kafka的消费位移呢?
> > >
> > >
> > > 多谢大家了
> > >
> > > 范超
> > >
> >
> >
> > --
> >
> > Best,
> > Benchao Li
> >
>

回复