trident 序列号问题
在使用Storm的trident做流计算开发时,遇到一个诡异的问题:
我继承IPartitionedTridentSpout或者IOpaquePartitionedTridentSpout接口做事务型实时计算的开发,类型T通常是用来每个批次序列化到ZK中的偏移量。我遇到的问题是:只要实时应用启动后不终止,每个批次发送的消息的偏移量都是接着上一个批次消息的偏移量继续向后移动的。但是只要应用终止后重新启动,发送的消息就会从消息队列的起始位置重新开始,好像ZK中保存的偏移量根本没起作用。
之前在没有使用trident的时候,我继承的是IPartitionedTransactionalSpout或者IOpaquePartitionedTransactionalSpout接口。这两个接口在处理每个批次时,都会将下一批次消息的偏移量序列化到ZK中,当需要发送下一批次的消息时,是从ZK中去读取下一批次消息的偏移量。按照这个处理逻辑,应该不会出现一直运行就正常,一重启就重头发送消息这种问题。
研究了trident的源码后发现,原来trident对这一块逻辑做了改进,为了减轻ZK的压力,trident在内存中维护了一个TreeMap类型的对象,里面保存了批次ID与偏移量的对应关系。Trident在处理每个批次消息的时候都会既向TreeMap中保存一份偏移量,又向ZK中序列化一份偏移量。在需要处理下一批次消息时,trident只是从内存的TreeMap中读取偏移量,而不需要从ZK中读取偏移量,只有当应用重启时,trident才从ZK中读取偏移量。
这就很好的解释了为什么我的应用一直运行时没有问题,一旦重启,处理的消息就会从头开始。同时,也可以推理出,其实trident序列化到ZK中的偏移量应该是有问题的,这才导致应用重启时没有读出来。
到ZK中去查了一下序列化进去的偏移量,发现果然序列化出现了问题。于是,继续研究trident做序列化的代码。发现原来trident修改了序列化对象的方式。从backtype.storm.transactional.state.TransactionalState里面的setData和getData方法可以看到,非trident的storm使用的是Kryo序列化框架;而从storm.trident.topology.state.TransactionalState里面的setData和getData方法可以看到,trident使用的是JSON-Simple的序列化方式,再具体点是用
String org.json.simple.JSONValue.toJSONString(Object arg0) 方法进行序列化。原生的JSONValue.toJSONString()方法是不能序列化自定义类的。而我之前使用的T类型就是一个自定义类型,这也是导致偏移量没有成功序列化到ZK中的原因。最后我将T类型修改为JSONObject来保存偏移量,解决了序列化到ZK错误的问题。
我不大清楚trident修改序列化方式的目的是什么。它导致之前使用非trident封装Spout的代码无法重用,希望对序列化有深入研究的同学能够指教。
trident 序列号问题的更多相关文章
- 解决VS2008在win7找不到输入序列号的地方
1.VS2008在Windows7 打开维护界面看不到可以输序列号的地方. 因为微软把他隐藏了. 2.我们可以借用工具把他显示出来 下载地址:http://www.zlsoft.com/techbbs ...
- Oracle数据库自动备份SQL文本:Procedure存储过程,View视图,Function函数,Trigger触发器,Sequence序列号等
功能:备份存储过程,视图,函数触发器,Sequence序列号等准备工作:--1.创建文件夹 :'E:/OracleBackUp/ProcBack';--文本存放的路径--2.执行:create or ...
- TCP初始化序列号ISN
TCP初始化序列号ISN TCP初始化序列号不能设置为一个固定值,因为这样容易被攻击者猜出后续序列号,从而遭到攻击. RFC1948中提出了一个较好的初始化序列号ISN随机生成算法. ISN = M ...
- iOS冰与火之歌(番外篇) - 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权
iOS冰与火之歌(番外篇) 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权 蒸米@阿里移动安全 0x00 序 这段时间最火的漏洞当属阿联酋的人权活动人士被apt攻击所使用 ...
- ORACLE实现自定义序列号生成
实际工作中,难免会遇到序列号生成问题,下面就是一个简单的序列号生成函数 (1)创建自定义序列号配置表如下: --自定义序列 create table S_AUTOCODE ( pk1 ) primar ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 14.序列号的设计,不重复的实现一机一码
目 录 第十四章 序列号的设计... 2 14.1 设计原则... 2 14.2 设计思想... 3 14.3 代码实现... 4 14. ...
- Android 手机卫士--绑定sim卡序列号
现在开始具体 处理每一个导航页面的逻辑,首先看第二个导航页 本文地址:http://www.cnblogs.com/wuyudong/p/5949775.html,转载请注明出处. 这里需要实现绑定s ...
- C#/VB.NET 获取电脑属性(硬盘ID、硬盘容量、Cpu序列号、MAC地址、系统类型)
在开发过程中,经常需要获取电脑的一些属性,如获取硬盘ID/CPU序列号/MAC地址作为来加密字符串. 1.硬盘 在我查看网上一些文档时,发现很多人对硬盘序列号很模糊~ 什么叫硬盘序列号?指的是作为一个 ...
- 解决SmartGit序列号问题
SmartGit过了30天试用期之后,就需要用户输入序列号才能继续使用,有一个办法可以跳过输入序列号. 一.windows+R 输入:%APPDATA%\syntevo\SmartGit 二.打开7 ...
随机推荐
- Web service是什么?(转)
我认为,下一代互联网软件将建立在Web service(也就是"云")的基础上. 我把学习笔记和学习心得,放到网志上,欢迎指正. 今天先写一个最基本的问题,Web service到 ...
- 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的 ...
- ORM框架-VB/C#.Net实体代码生成工具(EntitysCodeGenerate)【ECG】4.5
摘要:VB/C#.Net实体代码生成工具(EntitysCodeGenerate)[ECG]是一款专门为.Net数据库程序开发量身定做的(ORM框架)代码生成工具,所生成的程序代码基于OO.ADO.N ...
- D - K Smallest Sums(多路归并+贪心)
Problem K K Smallest Sums You're given k arrays, each array has k integers. There are kk ways to pic ...
- Spring MVC Controller单例陷阱
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lavasoft.blog.51cto.com/62575/1394669 Spr ...
- jQery无缝滚动效果
思路: 赋值所有li,添加到ul末尾,重新计算ul宽度 每次移动一个固定的值,当超出一半时,将ul拉回原位 以下代码 <!DOCTYPE html> <html> <he ...
- 错误"Lc.exe 已退出,代码 -1 "
今天做项目的时候突然出现编译不通过,错误为Lc.exe已退出,代码为-1.这让我郁闷了至少30分钟,后来上网查了一下,才知道原因所在,我们项目中使用了第三方组件(Infragistics)造成的,至于 ...
- Linux命令之cut
cut:文件的每一行剪切字节.字符和字段并将这些字节.字符和字段写至标准输出.如果不指定 File 参数,cut 命令将读取标准输入.必须指定 -b.-c 或 -f 标志之一. 主要参数: -b(by ...
- 剑指Offer05 用栈模拟队列
添加了模板类应用 /************************************************************************* > File Name: ...
- 【思路,dp,BigInteger】ZOJ - 2598 Yet Another Digit
[redundant binary - 冗余二进制]:由0,1,2构成的二进制形式,基数还是2. 现给你一十进制数n,问其可转化成多少种冗余二进制形式. 首先要想到:2x = 2*2x-1 也就是说 ...