回复:请教二阶段提交问题

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

回复:请教二阶段提交问题

蒋佳成(Jiacheng Jiang)
两阶段提交的第一阶段提交中,事务参与者反馈ok后需要作出之后一定能提交事务的承诺,事务参与者需要做些事来兑现承诺比如将事务操作持久化。在FlinkKafkaProducer中,preCommit就是调用了KafkaProducer的flush将数据刷到kafka中,在整个checkpoint完成后再提交事务,如果提交失败,会在job重启时再次提交事务。因此,我们需要保证的是preCommit成功后commit一定要能成功,这个需要根据具体写入的存储提供的特性来完成。




------------------ 原始邮件 ------------------
发件人: "高亮"<[hidden email]&gt;;
发送时间: 2020年9月25日(星期五) 中午11:14
收件人: "user-zh"<[hidden email]&gt;;
主题: 请教二阶段提交问题



各位大佬,请教一下二阶段提交的问题,preCommit预提交失败回滚已经很清楚了,就是在commit阶段提交如果失败会怎么,比较迷惑。


我自己测试了一下,发现只要是commit失败会造成数据丢失,但是看了下方法注释,说是失败了后会重启flink恢复到最近的state,继续提交,可是我在程序里有专门打印source输入的流数据,发现没有按到任何数据进入,也就是说flink重启后就直接调用commit再次提交。


可是再次提交没有意义啊,没有数据[捂脸哭]


所以请教大佬,当commit出现异常后,flink内部是如何解决的,作为flink应用者,如何正确使用避免和解决这类问题!
Reply | Threaded
Open this post in threaded view
|

Re: 请教二阶段提交问题

tison
> 可是再次提交没有意义啊,没有数据[捂脸哭]

这个事儿是这样的,你用 checkpoint 之后呢没有反过来确认的 commit 会留在 state 里,所以重启的时候重新加载 state
的时候就会再提交一遍。然后向 kafka 这一类存储 commit offset 是幂等的,发现已经 commit 过就跳过就 OK 了。

Best,
tison.


蒋佳成(Jiacheng Jiang) <[hidden email]> 于2020年9月26日周六 下午4:01写道:

>
> 两阶段提交的第一阶段提交中,事务参与者反馈ok后需要作出之后一定能提交事务的承诺,事务参与者需要做些事来兑现承诺比如将事务操作持久化。在FlinkKafkaProducer中,preCommit就是调用了KafkaProducer的flush将数据刷到kafka中,在整个checkpoint完成后再提交事务,如果提交失败,会在job重启时再次提交事务。因此,我们需要保证的是preCommit成功后commit一定要能成功,这个需要根据具体写入的存储提供的特性来完成。
>
>
>
>
> ------------------ 原始邮件 ------------------
> 发件人: "高亮"<[hidden email]&gt;;
> 发送时间: 2020年9月25日(星期五) 中午11:14
> 收件人: "user-zh"<[hidden email]&gt;;
> 主题: 请教二阶段提交问题
>
>
>
> 各位大佬,请教一下二阶段提交的问题,preCommit预提交失败回滚已经很清楚了,就是在commit阶段提交如果失败会怎么,比较迷惑。
>
>
>
> 我自己测试了一下,发现只要是commit失败会造成数据丢失,但是看了下方法注释,说是失败了后会重启flink恢复到最近的state,继续提交,可是我在程序里有专门打印source输入的流数据,发现没有按到任何数据进入,也就是说flink重启后就直接调用commit再次提交。
>
>
> 可是再次提交没有意义啊,没有数据[捂脸哭]
>
>
> 所以请教大佬,当commit出现异常后,flink内部是如何解决的,作为flink应用者,如何正确使用避免和解决这类问题!