FlinkToMySql两阶段提交

版本

Flink1.10

实现

  1. 继承TwoPhaseCommitSinkFunction
  2. 实现invoke()、beginTransaction()、preCommit()、commit()、abort()等方法

流程

beginTransaction---->preCommit,同时开启下一次beginTransaction---->commit---->preCommit,同时开启下一次beginTransaction---->commit。。。。。。
大概理解是下边这个流程
beginTransaction,invoke,preCommit,commit(第一次checkpoint)
---------------------------------------------------->beginTransaction,invoke,preCommit,commit(第二次checkpoint)
---------------------------------------------------------------------------------------------------------->beginTransaction,invoke,preCommit,commit(第三次checkpoint)

注意:
1、如果commit期间有异常,则重试commit方法。
2、如果invoke期间有异常,则回滚到上一个checkpoint,执行一下上一个checkpoint的commit方法(很奇怪,没理解这里),然后进行重试后续的数据。
3、如果某个并行度由于数据原因,commit阶段失败,然后停止运行,之后重启。因为偏移量会卡住,又消费同样有问题的数据,会继续失败,但是其他并行度可会成功消费完毕数据。

代码测试

public abstract class MyTwoPhaseCommitSinkFunction<IN> extends TwoPhaseCommitSinkFunction<IN, List<IN>, Void> {
    public MyTwoPhaseCommitSinkFunction() {
        super((TypeSerializer<List<IN>>) new KryoSerializer<IN>((Class<IN>) List.class, new ExecutionConfig()), VoidSerializer.INSTANCE);
    }


    @Override
    protected void invoke(List<IN> list, IN value, Context context) throws Exception {
        System.err.println("invoke开始......"+list);
        list.add(value);
        System.err.println("invoke结束......"+list);
    }

    @Override
    protected List<IN> beginTransaction() throws Exception {
        System.err.println("beginTransaction......");
        return new ArrayList<>();
    }

    @Override
    protected void preCommit(List<IN> list) throws Exception {
        System.err.println("preCommit......"+list);
    }



    @Override
    protected void abort(List<IN> list) {
        System.err.println("abort......"+list);
    }
}
public class App {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        env.enableCheckpointing( 5000, CheckpointingMode.EXACTLY_ONCE);
        env.setStateBackend(new FsStateBackend("file:///C:/Jian_Coding/Flink/Study/checkpoint"));
        SingleOutputStreamOperator<String> sourceDS = env.addSource(MyKafkaUtil.getKafkaSource()).name("kafkaSourceFun");
        sourceDS.addSink(new MyTwoPhaseCommitSinkFunction<String>() {
            @Override
            protected void commit(List<String> list) {
/*                long l = System.currentTimeMillis();
                if(l%2==0){
                    int i = 1/0;
                }*/
                System.err.println("commit......"+list);
            }
        });
        env.execute();
    }
    
}
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值