• 使用flink和kafka实现端到端的Exactly Once语义


    1、背景

    1. Flink:1.4.0+
    2. Kakfa:0.11+

    使用场景:flink的source和sink都是kafka,这里的source和sink不限于kafka,可以使用任何一种提供了类似协调机制(2PC)的sink/source。

    关键点:

    1. Kafka source支持重新消费,手动commit
    2. Kafka sink支持2PC(two-phase commit protocol
    3. Flink的checkpoint机制

    2、End-to-end Exactly Once Applications with Apache Flink

    kafka从0.11开始支持事务(exactly-once语义),这为实现端到端的精确一致性语义提供了支持,结合flink,介绍下如何实现End-to-end Exactly Once的应用:

    一个典型例子:

    1. data source从kafka消费数据
    2. window聚合
    3. data sink将处理后的数据写入到kafka

    data sink为了提供exactly-once保证,必须将一个事务中的数据都写入到kafka,一次commit包含了2个checkpoint之间的所有的写操作,这保证了当失败时,也会回滚所有的写操作。

    第一步:pre-commit阶段。

    pre-commit是一次checkpoint的开始,flink的checkpoint barrier在operator中传递,当一个operator接收到barrier,触发state snapshot。

    比如Kafka source会保存消费的offset,完成后传递barrier。

    这个过程如果仅仅只涉及internal state(internal state是由flink保存和管理的),是没有问题的,但是如果涉及到external state,则需要外部系统提供一致性保证,外部系统必须要提供对2PC的事务支持。

    当所有的operator完成了checkpoint,Pre-commit阶段就算完成了。Checkpoint的snapshot包含了整个application的状态,包括外部系统的pre-commited的external state,如果发生失败,可以回滚到最近一次成功的snapshot。

    第二步:JobManager通知所有的operator,checkpoint完成了,执行commit阶段。

    例子中的data source和window operator没有external state,在commit执行阶段无需额外的操作。data sink有external state,需要commit这次事务。

    整个流程如下:

    1. 当所有的operator完成了pre-commit(checkpoint snapshot),开启一个commit。
    2. 如果有一个pre-commit失败了,其他都abort,回滚到最近一次成功的checkpoint。
    3. Pre-commit成功后,所有的operator和外部系统必须保证commit执行成功,如果有失败(如网络中断),则整个flink application fail,flink任务按重启策略重启,开始一次新的commit尝试。

    3、Implementing the Two-Phase Commit Operator in Flink

    基于Flink的TwoPhaseCommitSinkFunction,实现一个2PC的sink,这个sink的实现机制依赖外部系统对2PC的支持:

    1. beginTransaction:开始事务,做一些准备工作。
    2. preCommit:预提交阶段,如临时保存等。
    3. commit:提交操作。
    4. abort:回滚,撤回操作。

    如果pre-commit成功了但是commit没有到达operator失败就发生了,flink会将operator恢复到pre-commit时的状态,然后继续commit,我们需要提供足够的信息让flink重启后决定是commit还是abort。

    原文:https://www.ververica.com/blog/end-to-end-exactly-once-processing-apache-flink-apache-kafka

  • 相关阅读:
    vim 多个文件切换
    Ruby 格式化代码 vim
    Ruby 配置vimrc
    print puts p
    开机跳过开机选择系统的选项界面
    Linux学习笔记:rm删除文件和文件夹
    Linux学习笔记:ps -ef、ps aux、kill -9
    Linux学习笔记:ctrl+z、ctrl+c、ctrl+d的区别
    Shell学习笔记:<<EOF子命令
    Linux学习笔记:crontab定时任务
  • 原文地址:https://www.cnblogs.com/luxiaoxun/p/13355730.html
Copyright © 2020-2023  润新知