Java 防风雨螺栓罐';t从喷口反序列化对象

Java 防风雨螺栓罐';t从喷口反序列化对象,java,apache-kafka,apache-storm,apache-storm-topology,Java,Apache Kafka,Apache Storm,Apache Storm Topology,我正在使用Storm 1.1.2、JDK 8(Storm不喜欢JDK 9编译代码)、Kafka 0.11和Docker Compose制作一个spring应用程序 其想法是拥有一个容器化服务,可以接收REST调用来创建storm拓扑,然后将它们提交给storm集群。一切都在本地工作,但将拓扑提交从提交到本地群集移动到StormSubmitter会导致问题。我已经解决了大多数问题,但是有一个奇怪的序列化问题 我有一个喷口,它成功地读到了卡夫卡的作品。它读取Protobuf对象的字节数组,并使用自定

我正在使用Storm 1.1.2、JDK 8(Storm不喜欢JDK 9编译代码)、Kafka 0.11和Docker Compose制作一个spring应用程序

其想法是拥有一个容器化服务,可以接收REST调用来创建storm拓扑,然后将它们提交给storm集群。一切都在本地工作,但将拓扑提交从提交到本地群集移动到
StormSubmitter
会导致问题。我已经解决了大多数问题,但是有一个奇怪的序列化问题

我有一个喷口,它成功地读到了卡夫卡的作品。它读取Protobuf对象的字节数组,并使用自定义反序列化程序从中创建消息。我从这个喷口读取了两个不同的螺栓,一个打印传入消息(螺栓A),另一个根据字段过滤消息并将它们发送到另一个要聚合的螺栓(螺栓B)

我注意到两个螺栓之间的唯一区别是螺栓B有一个构造,而螺栓a没有

出于某种原因,bolt A从喷口接收消息并打印它们没有问题,但每次消息到达bolt B时,它都会引发异常
com.esotericsoftware.kryo.KryoException:无法创建类(不缺少参数构造函数):my.package.MyProtobufMessage
。我看到您可以为类注册序列化程序,但是为什么螺栓A能够处理消息,而螺栓B不能

另外还有一个单独的问题,但当我添加第三个拓扑时,nimbus没有为它指定一个主管。一个拓扑将出现在2个works和9个Exec中,第二个拓扑将出现在2个Worker和6个Exec中,然后我将添加第三个拓扑,它将显示在UI和Nimbus日志中,但不会显示在supervisor日志中。在UI中,第三个拓扑将有0个worker、exec和0个分配的mem

您可能“幸运”,因为喷口和螺栓A位于同一个worker中,而螺栓B位于另一个worker中。Storm不会序列化元组,除非它们被传输到另一个worker,这可能就是bolt A可以读取消息的原因

关于第三个拓扑问题,您需要确保您的主管有足够的工作插槽用于拓扑。每个主管在Storm配置(Storm.yaml)中定义它愿意运行多少工作JVM。我猜前两种拓扑占据了所有的插槽

监控程序的默认配置为

supervisor.slots.ports:
    - 6700
    - 6701
    - 6702
    - 6703
这允许每个主管上有4个工作JVM。由于辅助JVM不是共享的,如果您运行两个拓扑,每个拓扑占用2个辅助,那么您已经用完了所有插槽。您可以添加更多插槽,或添加更多管理计算机,或减少拓扑所需的工作人员数量