繁体   English   中英

风暴螺栓无法反序列化喷口中的物体

[英]Storm bolt can't deserialize object from spout

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

这个想法是要有一个容器化的服务,该服务可以接收REST调用以创建风暴拓扑,然后将其提交给风暴集群。 一切都在本地工作,但是将拓扑提交从提交到本地集群转移到StormSubmitter会引起问题。 我已经解决了大多数问题,但是有一个奇怪的序列化问题。

我有一个喷口,可以成功读取Kafka。 它读取Protobuf对象的字节数组,并使用自定义反序列化器从中创建消息。 我从此喷口读取了两个不同的螺栓,一个螺栓打印传入的消息(螺栓A),一个螺栓根据字段过滤消息并将其发送到另一个螺栓进行聚合(螺栓B)。

我注意到这两个螺栓之间的唯一区别是,螺栓B具有构造函数,而螺栓A没有。

出于某种原因,螺栓A com.esotericsoftware.kryo.KryoException: Class cannot be created (missing no-arg constructor): my.package.MyProtobufMessage从喷口接收消息并打印消息,但是每次消息到达螺栓B时,都会引发异常com.esotericsoftware.kryo.KryoException: Class cannot be created (missing no-arg constructor): my.package.MyProtobufMessage 我看到您可以为类注册序列化程序,但是为什么螺栓A无法处理螺栓A?

这也是一个单独的问题,但是当我添加第三个拓扑时,nimbus不会为其分配主管。 一个拓扑将包含2个工作和9个执行程序,第二个拓扑将包含2个工作人员和6个执行程序,然后我将添加第三个拓扑,该拓扑将显示在UI和Nimbus日志中,而不显示在主管日志中。 在用户界面中,第三个拓扑将有0个工作程序,执行程序和0个分配的内存

您可能很“幸运”,因为喷口和螺栓A在同一个工人中,而螺栓B在另一个工人中。 Storm不会序列化元组,除非它们被转移到另一个工作程序中,这可能就是螺栓A可以读取消息的原因。

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

主管的默认配置是

supervisor.slots.ports:
    - 6700
    - 6701
    - 6702
    - 6703

每个主管上允许4个辅助JVM。 由于不共享工作JVM,因此如果您正在运行2个拓扑,每个拓扑占用2个工作器,则您已经用完了所有插槽。 您可以添加更多插槽,也可以添加更多主管计算机,或者减少拓扑所需的工作人员数量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM