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 ...
随机推荐
- Oracle的trunc和dbms_random.value随机取n条数据
今天在review项目代码的时候看到这样一个问题,有一张号码表,每次需要从这样表中随机取6个空闲的号码,也就是每次取出来的6个号码应该都会有所不同.然后我就看到了这样的SQL select t.* ...
- SSMTP—让Linux系统从Office 365发送邮件
SSMTP-让Linux系统从Office 365发送邮件 导读 SSMTP 是一个非常简单实用的小工具,它可以将 Linux 系统的电子邮件中继到 Office 365.Google 或其它第三方 ...
- Long Long Message 后缀数组入门题
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 22564 Accepted: 92 ...
- java根据图片和文字生成自定义图片
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; i ...
- unity中UI界面显示FPS
直接上代码 using UnityEngine; using System.Collections; public class HUDFPS : MonoBehaviour { ...
- 《算法导论》习题解答 Chapter 22.1-2(邻接矩阵与链表)
链表如图: 矩阵: 1 2 3 4 5 6 7 1 0 1 1 0 0 0 0 2 1 0 0 1 1 0 0 3 1 0 0 0 0 1 1 4 0 1 0 0 0 0 0 5 0 1 0 0 0 ...
- bash 中的case语法
CASE语法格式备忘 case $variable-name in pattern1) command1 ... .... commandN ;; pattern2|pattern3|pattern4 ...
- EasyGUI基础教程
安装EasyGUI 教程http://www.cnblogs.com/zym941001/p/5323319.html Helloworld import easygui as g g.msgbox( ...
- POJ 3660 Cow Contest (闭包传递)
Cow Contest Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7690 Accepted: 4288 Descr ...
- hdu 4711 动态规划
思路:其实这题是个挺水的动态规划,一开始就能AC,可是不知道错哪了,瞎改瞎交,WA了数十次.AC之后怎么改都是AC,也不知道改了什么地方,郁闷死了~~~难道开始时的测试数据有问题??? dp[i][j ...