分享

storm处理一比交易的耗时报错

mjjian0 发表于 2015-4-12 19:52:12 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 7 16400
本帖最后由 mjjian0 于 2015-4-12 19:55 编辑

六台flume服务器,三台kafka服务器,大概流程是这样:flume采集数据到kafka,然后storm去kafka数据分析,为了做交易耗时统计,采用redis做缓存。

我日志文件的数据格式是这样的:
第一个字段是traceid,第四个字段是status,第五个字段是时间timestamp,在日志文件中同一个traceid的status状态,一定是值为start的在前面。
01        130        10        START        1427857588        com.newtouchone.watchmen.Example#method        
01        130        10        CLIENT_SEND        1427857598        com.newtouchone.watchmen.Example#method  
01        130        10        SERVER_RECV        1427857607        com.newtouchone.watchmen.Example#method      
01        130        10        SERVER_SEND        1427857616        com.newtouchone.watchmen.Example#method     
01        130        10        CLIENT_RECV        1427857630        com.newtouchone.watchmen.Example#method      
01        130        10        END        1427857637        com.newtouchone.watchmen.Example#method      

然后我在一个bolt里面先判断tuple的status值是否为start的,如果为start的则把它放入redis中去,比如key:start_01 value: 1427857588,这里的value是timestamp
接着判断是否为end,如果为end则先从redis中取key为start_01的值,然后和当前tuple的timestamp值计算耗时,但是问题来了,通过压力测试,在这一步从redis取值的时候报空指针异常。我的程序是这样的:
55.png
难道status值为END的比值为START的tuple先过bolt????

已有(7)人评论

跳转到指定楼层
mjjian0 发表于 2015-4-12 20:24:19
回复

使用道具 举报

lzw 发表于 2015-4-12 20:42:44
mjjian0 发表于 2015-4-12 20:24
本帖//、看得多 回的少啊

如果start不出现错误,end应该也不会。
除非在end的时候,时间戳为空了,导致转换失败
回复

使用道具 举报

mjjian0 发表于 2015-4-12 20:53:04
lzw 发表于 2015-4-12 20:42
如果start不出现错误,end应该也不会。
除非在end的时候,时间戳为空了,导致转换失败

会不会是在数据到kafka时候,把日志里的顺序打乱了,导致,storm取的时候就是先取到的end的数据,然后报空指针异常啊?
回复

使用道具 举报

lzw 发表于 2015-4-12 21:04:15
mjjian0 发表于 2015-4-12 20:53
会不会是在数据到kafka时候,把日志里的顺序打乱了,导致,storm取的时候就是先取到的end的数据,然后报 ...

如果是这样的话,他们就不是并列的关系。
把end的情况放到start里面。采用下面的方式
if(start)
{
if(end)
{}

}
回复

使用道具 举报

mjjian0 发表于 2015-4-12 21:09:53
lzw 发表于 2015-4-12 21:04
如果是这样的话,他们就不是并列的关系。
把end的情况放到start里面。采用下面的方式
if(start)

不会的,一条数据的状态不可能既是start又是end的。
你所说的并行是什么意思啊、
回复

使用道具 举报

lzw 发表于 2015-4-12 21:47:29
mjjian0 发表于 2015-4-12 21:09
不会的,一条数据的状态不可能既是start又是end的。
你所说的并行是什么意思啊、



storm取的时候就是先取到的end的数据,然后报空指针异常啊?
你的意思是他们有一个顺序?
回复

使用道具 举报

尘世随缘 发表于 2015-4-13 13:22:40
并行处理,不一定先有start再有end啊。有可能先end过来再start过来。可以先换个思路去解决这个问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条