`

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 ...

    扩展logback将日志输出到Kafka实例源码

    通常,你可以使用`kafka.serializer.StringEncoder`或`org.apache.kafka.common.serialization.StringSerializer`作为默认的序列化器,也可以根据需要实现自定义序列化器。 5. **日志级别与过滤**:在`logback.xml`...

    SpringBoot框架源码练习源码集合(数据库+完整源码)

    `springboot-netty-protobuf`项目展示了SpringBoot与高性能的Netty服务器的结合,以及使用Google Protobuf进行序列化和通信。Netty是异步事件驱动的网络应用框架,而Protobuf是一种高效的序列化协议,常用于服务间...

    基于深度学习的回复类型预测聊天机器人.pdf

    Seq2Seq模型是一种端到端的深度学习模型,通常用于处理序列到序列的转换问题,如机器翻译、文本摘要、对话系统等。模型由编码器和解码器组成,编码器将输入序列转换为内部表示,解码器再将该表示转换为输出序列。 5...

    面试题库(368题).zip

    - IO流:字节流、字符流、缓冲流、对象序列化。 2. **Java进阶**: - 设计模式:单例、工厂、观察者、装饰者等23种设计模式的应用。 - 泛型:泛型类、泛型方法、通配符等。 - 接口与抽象类:两者的区别与应用。...

    梳理的一些java开发中用上的框架和开发工具,肯定会遗漏,欢迎补充

    Apache Avro 是一种数据序列化系统,支持丰富的数据结构。 - **Thrift**: 工具。Apache Thrift 是一套跨语言的服务开发框架。 - **Protobuf**: 工具。Protocol Buffers (简称 Protobuf) 是Google的一种灵活高效的...

    weather-webservice

    【weather-webservice】是一个关于Web服务的项目,主要涉及了Web服务的基本...通过研究这个项目,开发者可以掌握Web服务的开发技术,包括Spring框架的应用、数据库操作、JSON序列化和反序列化、HTTP通信等关键技能。

    java学习路线(项目开发、web方向、大数据方向).rar

    - **IO流**:理解输入/输出流的概念,学习文件操作、网络通信以及对象序列化。 - **多线程**:学习线程的创建、同步、并发控制,理解线程池的概念。 - **反射机制**:掌握动态加载类、获取类信息、创建对象、调用...

    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、透明的调用远端服务器提供的功能...

Global site tag (gtag.js) - Google Analytics