上一篇文章所述的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. Autodesk Maya 2019 安装

    为什么我接触到建模了呢,我也不知道.只会弄点桌椅板凳简单动画,希望有时间更进一步学习,毕竟我还有一个开发游戏的梦想. 步骤:下载-安装-激活 Maya吧各版本合集下载 地址:https://pan.b ...

  2. WCF双通信

    请求过程中的回调 这是一种比较典型的双工消息交换模式的表现形式,客户端在进行服务调用的时候,附加上一个回调对象:服务在对处理该处理中,通过客户端附加的回调对象(实际上是调用回调服务的代理对象)回调客户 ...

  3. 下载apache旗下Web服务器软件

    apache官方网站:http://www.apache.org/ 1.百度搜索apache找到apache官网 2.进入apache官网打开旗下web服务器软件列表 3.进入apache旗下web服 ...

  4. 编译安装 openmcu

    1. install toolssudo apt-get install libtool autoconf flex bison automake pkg-config 2.yasm-1.3.0sed ...

  5. 父元素设置固定宽度并设置overflow:scroll,如何让子元素撑开父元素

    <div class="a"> <div class="b"> <div class="c">内容内容, ...

  6. jQuery.map(arr|obj,callback)

    jQuery.map(arr|obj,callback) 概述 将一个数组中的元素转换到另一个数组中.广州大理石机械构件 作为参数的转换函数会为每个数组元素调用,而且会给这个转换函数传递一个表示被转换 ...

  7. 007_FreeROTS队列

    (一)目的:进程间的通信 (二)队列创建 1. 动态创建队列,函数 xQueueCreate() QueueHandle_t xQueueCreate( UBaseType_t uxQueueLeng ...

  8. 数据结构---Set和Map

    1.Set数据结构 Set本质上是一个没有重复数据,但是具有irerator接口可以遍历的一种集合. Set本身也是一种数据结构的构造函数. 1.Set的初始化 var obj = new Set(参 ...

  9. django -过滤器的使用

    前情提要: 最近工作中用到django 中的  自定制过滤器的内容, 再此 复习一波过滤器和自定制 过滤器的内容 自定制过滤器   1.在settings中的INSTALLED_APPS配置当前app ...

  10. Vue项目开发最新、最全代码规范文档

    Vue项目开发最新.最全代码规范文档 2019年02月21日 10:43:49 yw00yw 阅读数 337   一. 目录结构 |— build 构建脚本目录 |— build.js 生产环境构建( ...