storm源代码分析—Transactional spouts

storm源代码分析—Transactional spouts

大家好,又见面了,我是全栈君。

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
关注超人学院微信二维码:
storm源代码分析---Transactional spouts
关注超人学院java免费学习交流群:
storm源代码分析---Transactional spouts
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115807.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 如何解决Linux 系统下 ifconfig 命令无网络接口 ens33[通俗易懂]

    如何解决Linux 系统下 ifconfig 命令无网络接口 ens33

  • pycharm怎么运行django项目_django怎么用

    pycharm怎么运行django项目_django怎么用原文转载自:http://www.cnblogs.com/Leo_wl/p/5824541.html本文面向:有python基础,刚接触web框架的初学者。  环境:windows7   python3.5.1   pycharm专业版   Django1.10版  pip3一、Django简介  百度百科:开放源代码的Web应用框架,由Python语言编写……  

  • 2021年电子设计大赛预测–球形机器人设计方案

    随着2021年电赛的临近和清单的出炉,各参赛队伍都在紧张的备赛当中。然而在电赛清单中,我们能看到一个比较特别的器件–空心透明球。这个器件的特别之处在于它的吃尺寸过大,以至于让人摸不着头脑。在网上看过很多预测,关于这个球的预测大家也是众说纷纭。那么现在就根据预测的最多的一种情况–球形机器人,来进行简单的设计方案分析。准备材料三个直流电机,一个舵机,飞轮一片,空心透明亚克力球(直径在20~30cm),TB6612电机驱动模块两片,STM32F1最小系统板一块,杜邦线若…

  • oracle function详解,Oracle函数用法详解「建议收藏」

    oracle function详解,Oracle函数用法详解「建议收藏」本文概述函数是用于返回单个值的子程序。你必须在调用函数之前声明并定义一个函数。它可以在同一时间声明和定义,也可以在同一块中先声明然后定义。在Oracle中创建函数句法CREATE[ORREPLACE]FUNCTIONfunction_name[(parameter[,parameter])]RETURNreturn_datatypeIS|AS[declaration_sec…

  • matlab学习五,二元函数绘图方法

    matlab学习五,二元函数绘图方法plot3()绘制空间曲线%plot3(x,y,z,S)x,y,z为坐标,S为线型%绘制三维螺旋线x=cos(t)y=sin(t)z=tt=0:0.1:10*pi;x=cos(t);y=sin(t);z=t;plot3(x,y,z,’-r’);xlabel(‘x’);ylabel(‘y’);zlabel(‘z’);title(‘三维螺旋线’);2.绘制空间曲面绘制空间曲面的步骤为:绘制平面网格,计算网格上的函数值,绘制网面首先是绘制平面网格[X,Y]=m.

  • java-计算器模板及源码

    java-计算器模板及源码java-计算器模板及源码计算器实现了大部分基础功能:基本运算,菜单栏选项,并且拓展了普通型和科学兴选项等等,读者可以在此基础上进行修改和拓展。其他具体实现方法可以看源码,里面有详细的概述,代码框架清晰。读者在阅读和引用过程中,如有问题欢迎评论区留言和私信交流。运行环境:win10EclipseIDEforJavaDevelopers-2020-06下面是计算器的视图:importjava.awt.*;importjava.awt.event.ActionEvent;im

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号