上一篇文章所述的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环境——06 创建虚拟机

    若转载请于明显处标明出处:https://www.cnblogs.com/kelamoyujuzhen/p/9071181.html 虚拟机磁盘格式 创建一个raw格式的虚拟机磁盘 [root@Cen ...

  2. Kinect for Windows SDK开发入门(四):景深数据处理 上

    原文来自:http://www.cnblogs.com/yangecnu/archive/2012/04/04/KinectSDK_Depth_Image_Processing_Part1.html ...

  3. 搭建简单的mongod服务器

    1.首先,创建一个叫做mongodb_simple的目录,进入到目录中. 2.创建文件夹:data,用来存储数据库的数据文件. 3.创建文件夹:log,用来存储数据库的日志文件. 4.创建文件夹:bi ...

  4. Paper Reading:ION

    Inside-Outside Net (ION) 论文:Inside-Outside Net: Detecting Objects in Context with Skip Pooling and R ...

  5. 设计模式-模板方法设计模式--Template Method design pattern

    /** * Abstract implementation of the {@link org.springframework.context.ApplicationContext} * interf ...

  6. django中非菜单权限的归属

    非菜单权限的归属 :         1.设置表结构 : 在权限表中添加自连接的外键patent,parent_id连接permission表的id,可为空,当有parent_id时,说明它是一个普通 ...

  7. struts2之使用oracle分页(10)

    ToolsUtil //每页显示的记录数 public static final int NUM_PER_PAGE=5; /* * java.util.Date转java.sql.Date */ pu ...

  8. 13、Spring Boot 2.x 多数据源配置

    1.13 Spring Boot 2.x 多数据源配置 完整源码: Spring-Boot-Demos

  9. border-width

    border-width 语法: border-width:<line-width>{1,4} <line-width> = <length> | thin | m ...

  10. 数据结构实验之二叉树七:叶子问题(SDUT 3346)

    #include <bits/stdc++.h> using namespace std; struct node { char data; struct node *lc, *rc; } ...