请教二阶段提交问题

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

请教二阶段提交问题

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


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


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


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

Re: 请教二阶段提交问题

shizk233
需要搭配事务性存储机制来使用,能够保证预提交成功的数据能最终被commit成功。
详情可以参考孙金城老师关于这一部分的讲解和代码实现[1]

[1]https://www.bilibili.com/video/BV1yk4y1z7Lr?p=33

高亮 <[hidden email]> 于2020年9月25日周五 上午11:14写道:

> 各位大佬,请教一下二阶段提交的问题,preCommit预提交失败回滚已经很清楚了,就是在commit阶段提交如果失败会怎么,比较迷惑。
>
>
>
> 我自己测试了一下,发现只要是commit失败会造成数据丢失,但是看了下方法注释,说是失败了后会重启flink恢复到最近的state,继续提交,可是我在程序里有专门打印source输入的流数据,发现没有按到任何数据进入,也就是说flink重启后就直接调用commit再次提交。
>
>
> 可是再次提交没有意义啊,没有数据[捂脸哭]
>
>
> 所以请教大佬,当commit出现异常后,flink内部是如何解决的,作为flink应用者,如何正确使用避免和解决这类问题!
Reply | Threaded
Open this post in threaded view
|

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

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




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



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


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


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


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