本地阶级在风暴中不相容

时间:2016-04-26 07:58:35

标签: apache-storm

我有一个运行一段时间的旧拓扑。但最近,我需要更新这个拓扑结构,从而杀死它。当我尝试将更新的拓扑提交到风暴时,发生了这样的异常:

java.io.InvalidClassException: com.weibo.security.storm.bolt.IpCountBolt; local class incompatible: stream classdesc serialVersionUID = -5336119852024782309, local class serialVersionUID = -572783398581060861

所以,我杀死了风暴过程并尝试删除与风暴相关的所有内容,包括storm.log.dirstorm.local.dir,zookeeper中的整个节点/storm以及整个/tmp目录。但是,当我启动风暴并再次提交拓扑时,此异常仍然存在。

我设法通过更改拓扑中的类名来绕过它们,但这不应该是正确的解决方案。

我理解它将如何导致InvalidClassException。但我相信我删除了与旧拓扑相关的所有数据。为什么还在那里?是否有其他我错过的可能会隐藏旧拓扑的缓存?

1 个答案:

答案 0 :(得分:0)

问题在于serialVersionID的默认值。如果你没有为serialVersionID变量声明一个值,那么JVM将会随机出现一个值。如果你有暴风雨跑到JVM那么每个人都会想出它自己的价值。当您对序列化的其他JVM上的螺栓进行反序列化时,这会导致问题,因为反序列化对象的serialVersionID必须与本地jvm中类的serialVersionID匹配。

要解决此问题,请尝试为该类定义变量。如果您没有源代码,那么您必须创建一个声明了serialVersionID的子类。