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 ...
随机推荐
- 清除SQL Server 2008中登陆时的历史记录
win7 在地址栏直接输入下面路径,删除SqlStudio.bin文件%AppData%\Microsoft\Microsoft SQL Server\100\Tools\Shell
- 【iOS开发必备指南合集】申请企业级IDP、真机调试、游戏接入GameCenter 指南(实现仿官方的成就提示)、游戏接入OpenFeint指南;
本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-c ...
- 在C语言中,double、long、unsigned、int、char类型数据所占字节数
和机器字长及编译器有关系: 所以,int,long int,short int的宽度都可能随编译器而异.但有几条铁定的原则(ANSI/ISO制订的): 1 sizeof(short int)<= ...
- 文件共享windows server 2008 服务器
1.远程连接到windows server2008 E盘右键共享 2.不能创建文件夹 右键E盘→共享→高级共享→权限→全部打勾即可. 3.ok,文件服务器
- Inversions
There are N integers (1<=N<=65537) A1, A2,.. AN (0<=Ai<=10^9). You need to find amount o ...
- ServiceStack.Redis.RedisNativeClient的方法“get_Db”没有实现
Redis 4.0.0.0版本已经开始收费 Redis 4.0.5.0 已经完成收费 今日在更换Redis版本时 出现了ServiceStack.Redis.RedisNativeClient的方法“ ...
- 自定义uitableviewcell通过加上滑动手势进行删除对应的行。PS:用代理来实现
#import <UIKit/UIKit.h> @class ZSDCustomCell; //协议 @protocol ZSDCustomCellDelegate <NSObjec ...
- MySQL关于InnoDB的几个错误
阿里云服务器上装有MySQL 5.6,这几天MySQL服务经常死掉,启动MySQL服务(service mysql start),却报如下错误 Starting MySQL.. ERROR! The ...
- java jdbc连接mysql
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...
- 100天成就卓越领导力:新晋领导者的First100训练法
<100天成就卓越领导力:新晋领导者的First100训练法> 基本信息 原书名:Your Frist 100 days: How to Make Maximum Impact in Yo ...