Chandy Lamport算法及其应用(exactly once)

标签: chandy lamport 算法 | 发表时间:2018-05-28 14:13 | 作者:Kaiming Wan
出处:http://www.kaimingwan.com/

1. Chandy lamport算法简介

1.1 补充知识

先普及个概念(取自维基百科):

Snaphot algorithm:

  A snapshot algorithm is used to create a consistent snapshot of the global state of a distributed system. Due to the lack of globally shared memory and a global clock, this isn't trivially possible.

今天讨论的chandy and larmport算法也是分布式快照算法的一种,用于在分布式系统中记录一个全局一致的快照。

1.2 基本算法流程

原始论文可以参考 Distributed Snapshots: Determining Global States of Distributed System

算法有些前提如下,简单总结就是传输是基本可靠的,不会发送消息丢包,或者无法通信等问题。
The assumptions of the algorithm are as follows:

  • There are no failures and all messages arrive intact and only once
  • The communication channels are unidirectional and FIFO ordered
  • There is a communication path between any two processes in the system
  • Any process may initiate the snapshot algorithm
  • The snapshot algorithm does not interfere with the normal execution of the processes
  • Each process in the system records its local state and the state of its incoming channels

基本流程:

  论文中通过p,q两个节点传输令牌token来模拟算法流程


伪代码如下:

  // 进程p行为,通过向q发出Marker,发起snapshot
begin
       p record its state;
then
       send one Marker along c after p records its state and before p sends further messages along c
end

//进程q接受Marker后的行为,q记录自身状态,并记录通道c的状态
if q has not recorded its state then
        begin
              q records its state;
              q records the state c as the empty sequence
        end
else q records the state of c as the sequence of messages received along c after q’s state was recorded and before q received the marker along c. 

算法总体上比较好理解,重点是通过传递marker来记录整条链路的全局状态。后续恢复的时候每个节点都可以从自己之前记录的checkpoint中恢复出来。

1.3 主要应用场景

该算法主要用于一些分布式系统中,利用全局一致性快照可以保证消息传递的exactly once语义

2. Flink中的应用

这里简单扯下流计算的发展。流计算框架包含两个核心问题,即计算和状态管理。发展历程也比较相似:
storm(需要自己管理状态)->Samza(内部利用leveldb和kafka管理数据,但是不支持exactly once语义)->Spark streaming(支持exactly once但是mini batch的思路延迟相对较高)

Flink实现exactly once方式的核心思想是基于chandy and lamport,具体细节可以参考论文 Lightweight Asynchronous Snapshots for Distributed Dataflows

相比lamport的论文,这篇论文更加以实际工程角度说明了在流计算场景中如何实现exactly once语义。主要方式就是引入一个barrier,把input stream分为preshot records和post records。只有等到所有上游barrier才会继续往下处理。收到所有上游barrier的时候做一个snapshot。


主要缺点:图上也可以看出来,先收到的barrier的数据流可能由于要等待另外一个输入流的barrier而一直被阻塞,可能会产生较大的延迟

3. spark streaming

参考 Spark Streaming Programming Guide可知,现在spark streaming 支持exactly once主要需要保证处理数据流程的每一步均满足exactly once:

  1. receive data: 假设数据只会传一次,并且传送一定成功
  2. transform: RDD计算结果满足确定性,重复结算结果是一样的
  3. output : spark streaming输出结果到外部系统的时候采用一个唯一的id来判断是否要写出数据,参考Semantics of output operations

4. 关于End to End exactly总结

如果data source ,data sink本身满足exactly once,并且数据传输时也满足exactly once,那么可以认为整个系统是end-to-end exactly once的。大部分分布式系统现在都可以利用chandy lamport算法的思想来满足自己系统的exactly once。但是在对接sink的时候往往需要一些额外工作,例如flink输出到kafka需要用二阶段提交,spark streaming输出时使用唯一id判断是否已经写过,这些都是一些实现上的细节差异。

参考资料:

  1. 分布式Snapshot和Flink Checkpointing简介
  2. An Overview of End-to-End Exactly-Once Processing in Apache Flink (with Apache Kafka, too!)

相关 [chandy lamport 算法] 推荐:

Chandy Lamport算法及其应用(exactly once)

- - Blog of Kami Wan
Chandy lamport算法简介. 先普及个概念(取自维基百科):. 今天讨论的chandy and larmport算法也是分布式快照算法的一种,用于在分布式系统中记录一个全局一致的快照. 原始论文可以参考 Distributed Snapshots: Determining Global States of Distributed System.

缓存算法

- lostsnow - 小彰
没有人能说清哪种缓存算法由于其他的缓存算法. (以下的几种缓存算法,有的我也理解不好,如果感兴趣,你可以Google一下  ). 大家好,我是 LFU,我会计算为每个缓存对象计算他们被使用的频率. 我是LRU缓存算法,我把最近最少使用的缓存对象给踢走. 我总是需要去了解在什么时候,用了哪个缓存对象.

BFPRT算法

- zii - 小彰
BFPRT算法的作者是5位真正的大牛(Blum 、 Floyd 、 Pratt 、 Rivest 、 Tarjan),该算法入选了在StackExchange上进行的当今世界十大经典算法,而算法的简单和巧妙颇有我们需要借鉴学习之处. BFPRT解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分析,BFPRT可以保证在最坏情况下仍为线性时间复杂度.

贪心算法

- Shan - 博客园-首页原创精华区
顾名思义,贪心算法总是作出在当前看来最好的选择. 也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 当然,希望贪心算法得到的最终结果也是整体最优的. 虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解. 如单源最短路经问题,最小生成树问题等.

缓存算法

- 成 - FeedzShare
来自: 小彰 - FeedzShare  . 发布时间:2011年09月25日,  已有 2 人推荐. 没有人能说清哪种缓存算法由于其他的缓存算法. (以下的几种缓存算法,有的我也理解不好,如果感兴趣,你可以Google一下  ). 大家好,我是 LFU,我会计算为每个缓存对象计算他们被使用的频率.

K-Means 算法

- - 酷壳 - CoolShell.cn
最近在学习一些数据挖掘的算法,看到了这个算法,也许这个算法对你来说很简单,但对我来说,我是一个初学者,我在网上翻看了很多资料,发现中文社区没有把这个问题讲得很全面很清楚的文章,所以,把我的学习笔记记录下来,分享给大家. k-Means 算法是一种  cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法.

查找算法:

- - CSDN博客推荐文章
从数组的第一个元素开始查找,并将其与查找值比较,如果相等则停止,否则继续下一个元素查找,直到找到匹配值. 注意:要求被查找的数组中的元素是无序的、随机的. 比如,对一个整型数组的线性查找代码:. // 遍历整个数组,并分别将每个遍历元素与查找值对比. 要查找的值在数组的第一个位置. 也就是说只需比较一次就可达到目的,因此最佳情况的大O表达式为:O(1).

排序算法

- - 互联网 - ITeye博客
排序算法有很多,所以在特定情景中使用哪一种算法很重要. 为了选择合适的算法,可以按照建议的顺序考虑以下标准: .     对于数据量较小的情形,(1)(2)差别不大,主要考虑(3);而对于数据量大的,(1)为首要.  一、冒泡(Bubble)排序——相邻交换 .  二、选择排序——每次最小/大排在相应的位置 .

联接算法

- - CSDN博客数据库推荐文章
本文摘自《锋利的SQL》: http://item.jd.com/10380652.html. 在Microsoft SQLServer Management Studio中执行查询时,如果选定工具栏中的 按钮,可以看到为查询生成的执行计划. 执行计划以图形方式显示了SQL Server查询优化器选择的数据检索方法,如表扫描、排序、哈希匹配等.

理解EM算法

- Chin - 我爱自然语言处理
EM(Expectation-Maximization)算法在机器学习和自然语言处理应用非常广泛,典型的像是聚类算法K-means和高斯混合模型以及HMM(Hidden Markov Model). 笔者觉得讲EM算法最好的就是斯坦福大学Andrew Ng机器学习课的讲课笔记和视频. 本文总结性的给出普遍的EM算法的推导和证明,希望能够帮助接触过EM算法但对它不是很明白的人更好地理解这一算法.