`

storm的序列化问题及与spring的结合方式

阅读更多
最近打算在项目中用storm从一个database生成多个搜索引擎的实时索引, 于是看了一些相关的资料就开始上手了. 按照以前熟悉的套路, 使用spring来管理对象之间的依赖, 于是我开始将topology, spout, bolt看成一个个bean, 然后放在spring容器中来完成初始化, 但是在本地模式运行的时候, 出现序列化的问题(抛出java.io.NotSerializableException异常), 以为是有些类忘记实现序列化接口了, 于是给相关类加上了序列化接口, 再跑, 还是抛java.io.NotSerializableException异常, 说另外一个依赖jar中的类需要实现序列化接口, 这个就麻烦了, 另外一个jar我没法修改代码, 我想可能是我哪些地方用的不对, 于是在group(http://groups.google.com/group/storm-user)中google之, 发现很多人都碰到了跟我类似的问题, 看了里面的讨论, 发现storm的作者Nathan Marz(http://nathanmarz.com)针对这个问题给出了合理的解释:
The lifecycle of a bolt or spout is as follows:

1. Created on client side (from where you submit the topology) and
serialized using Java serialization
2. Serialized component is sent to all the tasks
3. Each task executing that component deserializes the component
4. The task calls "prepare" (for bolts) or "open" (for spouts) on the
component before it starts executing.

So if you need to do something like connect to a database, you should do
that in the "prepare" or "open" method.

出现这个问题主要是对一个spout/bolt的生命周期不是很了解导致, 一般来说spout/bolt的生命周期如下:
1.在提交了一个topology之后(是在nimbus所在的机器么?), 创建spout/bolt实例(spout/bolt在storm中统称为component)并进行序列化.
2.将序列化的component发送给所有的任务所在的机器
3.在每一个任务上反序列化component.
4.在开始执行任务之前, 先执行component的初始化方法(bolt是prepare, spout是open).

因此component的初始化操作应该在prepare/open方法中进行, 而不是在实例化component的时候进行.

后来我又看了这篇文章"Twitter Storm源代码分析之Topology的执行过程(http://xumingming.sinaapp.com/647/twitter-storm-code-analysis-topology-execution/)", 不过里面没有提到Nathan所说的这些内容.

知道了上面的过程之后, 于是我开始改造我的代码, 那么该如何将storm与spring结合起来呢? 于是我又开始在group中google之, 发现有个韩国人写了一个storm-spring-example(https://github.com/mykidong/storm-spring-example), 于是下载下来研究了一番, 原来需要在每个spout/bolt维护自己的ApplicationConext, 于是将一个all in one 的spring打散成spring-spout.xml, spring-bolt-xxx.xml. 然后在open/prepare方法中加载对应的spring配置文件.

改造完成之后, 运行OK!
分享到:
评论
8 楼 roy2011a 2017-09-01  
https://github.com/ebottabi/storm-spring-example
7 楼 roy2011a 2017-09-01  
能抗能打 写道
哥们儿,你好!能共享下那个storm与spring结合的案例例子吗?github上没有了。谢谢!邮箱:249014659@qq.com 


直接github可以搜的,我去,还要人家发你代码??
6 楼 能抗能打 2016-04-04  
哥们儿,你好!能共享下那个storm与spring结合的案例例子吗?github上没有了。谢谢!邮箱:249014659@qq.com 
5 楼 zh_ka 2016-01-08  
哥们儿,你好!能共享下那个storm与spring结合的案例例子吗?github上没有了。谢谢!邮箱:284203844@qq.com
4 楼 comJavaCom 2015-09-08  
哥们儿,你好!能共享下那个storm与spring结合的案例例子吗?github上没有了。谢谢!邮箱:297364537@qq.com
3 楼 zouruochen05 2015-04-19  
请问 ApplicationContext 没有实现 Serializable接口,spout/bolt 怎么能先维护ApplicationContext ?
2 楼 liu_305 2014-12-03  
哥们儿,你好!能共享下那个storm与spring结合的案例例子吗?github上没有了。谢谢!邮箱:1031757312@qq.com
1 楼 hzxlb910 2013-07-19  
看了您的博客,能否发个java写的storm一个小例子,给我学习一下,在网上看的都是原理,我想如果有个实例运行一下,也有个感性上的认识,我刚接触,还请多指教,谢谢。我的邮箱:409235520@qq.com

相关推荐

    storm-spring-autowire:使storm支持spring的注入功能

    这个项目采取了了在prepare方法中执行注入的方式使bolt在序列化完成后执行注入,绕开了storm的序列化机制 使用这个项目里 你可以通过以下代码做到最基本的注入 @Resource private SentenceCounter counter; public ...

    java开源包1

    nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...

    java开源包11

    nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...

    java开源包2

    nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...

    java开源包3

    nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...

    java开源包6

    nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...

    java开源包5

    nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...

    java开源包10

    nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...

    java开源包4

    nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...

    java开源包8

    nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...

    java开源包7

    nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...

    java开源包9

    nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...

    java开源包101

    nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...

    Java资源包01

    nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能...

    JAVA上百实例源码以及开源项目源代码

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

Global site tag (gtag.js) - Google Analytics