Transactionalspouts

Trident是以小批量(batch)的形式在处理tuple。而且每一批都会分配一个唯一的transaction id。不同spout的特性不同,一个transactionalspout会有例如以下这些特性:
1、有着相同txid的batch一定是一样的。

当重播一个txid相应的batch时,一定会重播和之前相应txid的batch中相同的tuples。

2、各个batch之间是没有交集的。每一个tuple仅仅能属于一个batch
3、每个tuple都属于一个batch,无一例外
这是一类很easy理解的spout。 tuple 流被划分为固定的batch而且永不改变。(trident-kafka 有一个 transactional spout 的实现。

你或许会问:为什么我们不总是使用transactional spout?这非常easy理解。

一个原因是并非全部的地方都须要容错的。举例来说。TransactionalTridentKafkaSpout 工作的方式是一个batch包括的tuple来自某个kafka topic中的全部partition。一旦这个batch被发出,在不论什么时候假设这个batch被又一次发出时,它必须包括原来全部的tuple以满足 transactional spout的语义。如今我们假定一个batch被TransactionalTridentKafkaSpout所发出,这个batch没有被成功处理,而且同一时候kafka的一个节点也down掉了。你就无法像之前一样重播一个全然一样的batch(由于kakfa的节点down掉,该topic的一部分partition可能会无法使用)。整个处理会被中断。

这也就是"opaque transactional" spouts(不透明事务spout)存在的原因 - 他们对于丢失源节点这样的情况是容错的,仍然可以帮你达到有且仅仅有一次处理的语义。后面会对这样的spout有所介绍。
在讨论"opaque transactional" spout之前,我们先来看看如何为transactional spout设计一个具有exactly-once语义的State实现。这个State的类型是"transactionalstate" 而且它利用了不论什么一个txid总是相应相同的tuple序列这个语义。
假如说你有一个用来计算单词出现次数的topology,你想要将单词的出现次数以key/value对的形式存储到数据库中。key就是单词。value就是这个这个单词出现的次数。你已经看到仅仅是存储一个数量是不足以知道你是否已经处理过一个batch的。你能够通过将value和txid一起存储到数据库中。

这种话,当更新这个count之前,你能够先去比較数据库中存储的txid和如今要存储的txid。假设一样。就跳过什么都不做。由于这个value之前已经被处理过了。假设不一样,就运行存储。这个逻辑能够工作的前提就是txid永不改变,而且Trident保证状态的更新是在batch之间严格顺序进行的。

考虑以下这个样例的执行逻辑。假定你在处理一个txid为3的包括以下tuple的batch:
["man"]
["man"]
["dog"]
假定数据库中当前保存了以下这种key/value 对:
man => [count=3, txid=1]
dog => [count=4, txid=3]
apple => [count=10, txid=2]
单词“man”相应的txid是1. 由于当前的txid是3,你能够确定你还没有为这个batch中的tuple更新过这个单词的数量。所以你能够放心的给count加2并更新txid为3. 与此同一时候,单词“dog”的txid和当前的txid是同样的,因此你能够跳过这次更新。此时数据库中的数据例如以下:
man => [count=5, txid=3]
dog => [count=4, txid=3]
apple => [count=10, txid=2]
很多其它精彩内容请关注:http://bbs.superwu.cn
关注超人学院微信二维码:
关注超人学院java免费学习交流群:

storm源代码分析---Transactional spouts的更多相关文章

  1. Twitter Storm源代码分析之ZooKeeper中的目录结构

    徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...

  2. Twitter Storm源代码分析之Nimbus/Supervisor本地目录结构

    storm集群里面工作机器分为两种一种是nimbus, 一种是supervisor, 他们通过zookeeper来进行交互,nimbus通过zookeeper来发布一些指令,supervisor去读z ...

  3. Storm入门(十一)Twitter Storm源代码分析之CoordinatedBolt

    作者: xumingming | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://xumingming.sinaapp.com/811/twitter-stor ...

  4. Apache 流框架 Flink,Spark Streaming,Storm对比分析(二)

    本文由  网易云发布. 本文内容接上一篇Apache 流框架 Flink,Spark Streaming,Storm对比分析(一) 2.Spark Streaming架构及特性分析 2.1 基本架构 ...

  5. Apache 流框架 Flink,Spark Streaming,Storm对比分析(2)

    此文已由作者岳猛授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 2.Spark Streaming架构及特性分析 2.1 基本架构 基于是spark core的spark s ...

  6. android-plugmgr源代码分析

    android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ...

  7. 转:SDL2源代码分析

    1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中 ...

  8. 转:RTMPDump源代码分析

    0: 主要函数调用分析 rtmpdump 是一个用来处理 RTMP 流媒体的开源工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, and rtmps://. ...

  9. 转:ffdshow 源代码分析

    ffdshow神奇的功能:视频播放时显示运动矢量和QP FFDShow可以称得上是全能的解码.编码器.最初FFDShow只是mpeg视频解码器,不过现在他能做到的远不止于此.它能够解码的视频格式已经远 ...

随机推荐

  1. 【Spark】Spark的Shuffle机制

    MapReduce中的Shuffle 在MapReduce框架中,shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过shuffle这个环节,shuffle的性 ...

  2. Hash表题目整数hash-HDOJ1425(转载)

      哈希表(散列表)的基本原理:使用一个下标范围比较大的数组来存储元素,一般通过设计一个函数(哈希函数,即散列函数),使得每个元素的关键字都与一个函数值(即数组下标)相对应,然后用该数组单元来存储对应 ...

  3. RHEL-resolv.conf文件修改后重启被还原

    修改resolve.conf文件之后,reboot或service restart network时,修改的内容被还原.关闭NetworkManager即可.# chkconfig |grep Net ...

  4. SpringTest2

    Spring 框架第二天 AOP切面编程 今天重点内容: 1. 什么是AOP ? AOP实现原理是怎样的? AOP相关术语 2. AOP底层实现 (了解) ----- JDK动态代理. Cglib动态 ...

  5. Mysql配置调优(转自阿铭论坛)

    Mysql配置文件my.cnf参数优化对于新手来讲,是比较难懂的东西,其实这个参数优化,是个很复杂的东西,对于不同的网站,及其在线量,访问量,帖子数量,网络情况,以及机器硬件配置都有关系,优化不可能一 ...

  6. python学习-day3

    今天是第三天学习,加油! 第一部分 集合 一.集合 1.什么是集合以及特性? 特性:无序的,不重复的序列,可嵌套. 2.创建集合 方法一:创建空集合 s1 = set() print(type(s1) ...

  7. 注册DLL,Unregister DLL

    前一篇文章,反复注册,反注册.... 写了一个小工具 怎么传图片感觉不对劲,StatusBar应改成 拖动DLL至上方 文件 http://files.cnblogs.com/magicdawn/Dl ...

  8. 解析Function.prototype.bind

    简介 对于一个给定的函数,创造一个绑定对象的新函数,这个函数和之前的函数功能一样,this值是它的第一个参数,其它参数,作为新的函数的给定参数. bind的作用 bind最直接的作用就是改变this的 ...

  9. js+图片实现图片flash效果

    var pic_width=685; //图片宽度 var pic_height=225; // 图片高度 var button_pos=4; //按扭位置 1左 2右 3上 4下 var stop_ ...

  10. tableview 分割线置最左边的解决方法

    首先在viewDidLoad方法加入以下代码: if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { [se ...