上一篇文章所述的Exactly-Once语义是针对Flink系统内部而言的.

那么Flink和外部系统(如Kafka)之间的消息传递如何做到exactly once呢?

问题所在:

如上图,当sink A已经往Kafka写入了数据,而sink B fail.

根据Flink的exactly once保证,系统会回滚到最近的checkpoint,

但是sink A已经把数据写入到kafka了.

Flink无法回滚kafka的state.因此,kafka将在之后再次接收到一份同样的来自sink A的数据,

这样的message delivery便成为了at least once

Solution ---- Two phase commit

Flink采用Two phase commit来解决这个问题.

Phase 1: Pre-commit

Flink的JobManager向source注入checkpoint barrier以开启这次snapshot.

barrier从source流向sink.

每个进行snapshot的算子成功snapshot后,都会向JobManager发送ACK.

当sink完成snapshot后, 向JobManager发送ACK的同时向kafka进行pre-commit.

Phase 2:Commit

当JobManager接收到所有算子的ACK后,就会通知所有的算子这次checkpoint已经完成.

Sink接收到这个通知后, 就向kafka进行commit,正式把数据写入到kafka

不同阶段fail over的recovery举措:

(1)     在pre-commit前fail over, 系统恢复到最近的checkponit

(2)     在pre-commit后,commit前fail over,系统恢复到刚完成pre-commit时的状态

Flink的two phase commit实现 ---- 抽象类TwoPhaseCommitSinkFunction

TwoPhaseCommitSinkFunction有4个方法:

1. beginTransaction()

  开启事务.创建一个临时文件.后续把原要写入到外部系统的数据写入到这个临时文件

2. preCommit()

  flush并close这个文件,之后便不再往其中写数据.同时开启一个新的事务供下个checkponit使用

3. commit()

  把pre-committed的临时文件移动到指定目录

4. abort()

  删除掉pre-committed的临时文件

深入理解Flink ---- End-to-End Exactly-Once语义的更多相关文章

  1. 深入理解Flink核心技术及原理

    前言 Apache Flink(下简称Flink)项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多人的关注.本文将深入分析Flink的一些关键技术与特性,希望 ...

  2. 深入理解Flink核心技术(转载)

    作者:李呈祥 Flink项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多的人关注Flink项目.本文将深入分析Flink一些关键的技术与特性,希望能够帮助读者 ...

  3. 深入理解Flink ---- 系统内部消息传递的exactly once语义

    At Most once,At Least once和Exactly once 在分布式系统中,组成系统的各个计算机是独立的.这些计算机有可能fail. 一个sender发送一条message到rec ...

  4. 深入理解Flink ---- Metrics的内部结构

    从Metrics的使用说起 Flink的Metrics种类有四种Counters, Gauges, Histograms和Meters. 如何使用Metrics呢? 以Counter为例, publi ...

  5. 理解Flink中的Task和SUBTASK

    1.概念 Task(任务):Task是一个阶段多个功能相同的subTask 的集合,类似于Spark中的TaskSet. subTask(子任务):subTask是Flink中任务最小执行单元,是一个 ...

  6. [转][c++11]我理解的右值引用、移动语义和完美转发

    c++中引入了右值引用和移动语义,可以避免无谓的复制,提高程序性能.有点难理解,于是花时间整理一下自己的理解. 左值.右值 C++中所有的值都必然属于左值.右值二者之一.左值是指表达式结束后依然存在的 ...

  7. Flink 如何通过2PC实现Exactly-once语义 (源码分析)

    Flink通过全局快照能保证内部处理的Exactly-once语义 但是端到端的Exactly-once还需要下游数据源配合,常见的通过幂等或者二阶段提交这两种方式保证 这里就来分析一下Sink二阶段 ...

  8. 新一代大数据处理引擎 Apache Flink

    https://www.ibm.com/developerworks/cn/opensource/os-cn-apache-flink/index.html 大数据计算引擎的发展 这几年大数据的飞速发 ...

  9. Apache Flink:特性、概念、组件栈、架构及原理分析

     2016-04-30 22:24:39    Yanjun Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时(Flink Runtim ...

随机推荐

  1. KVM虚拟机高级设置——09 设置KVM虚拟机开机自动启动

    在kvm图形化管理工具里面可以设置,让kvm虚拟机随着宿主虚拟机一起启动. 必须在关机状态下做 . 设置好以后会像Windows一样创建一个快捷方式 [root@CentOS2 ~]# cd /etc ...

  2. Ubuntu系统---C++之Eclipse编译器 CDT插件安装

                                                                                         Ubuntu系统---Ecli ...

  3. proc文件系统详解

    /proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux内核空间和用户间之间进行通信.在 /proc 文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段, ...

  4. [唐胡璐]Selenium技巧 - 处理Windows程序(进程)

    Selenium WebDriver java 提供了一个专门的WindowsUtils类去和Windows操作系统交互。 就像我们之前说过有时候跑完脚本后,IEDriverServer.exe进程没 ...

  5. Python中的if和while

    if 判断 if形式有三种: 1.if ... 2.if ... else ... 3.if ... elif ... else ... 实例: inp = raw_input('>>&g ...

  6. JUC-12.4-execute和sumbit的区别

    在Executor接口中只定义了execute方法,而submit方法则是在ExecutorService接口中定义的. execute没有返回值,而submit有返回值. 转自: https://w ...

  7. Java 相同类型强制转换异常

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u010750497/article/det ...

  8. leetcode解题报告(8):Remove Element

    描述 Given an array and a value, remove all instances of that value in place and return the new length ...

  9. c实现循环链表

    解决约瑟夫环问题核心步骤: 1.建立具有n个节点.无头的循环链表 2.确定第一个报数人的位置 3.不断从链表中删除链节点,直到链表为空 #include <iostream> #inclu ...

  10. P3368 【模板】树状数组 2

    原题链接  https://www.luogu.org/problemnew/show/P3368 这个题和洛谷P3374树状数组1 有些不同,在普通的树状数组上运用了差分的知识.(由于P3374涉及 ...