storm bolt无法从喷口反序列化对象

cl25kdpy  于 2021-06-06  发布在  Kafka
关注(0)|答案(1)|浏览(335)

我正在使用Storm1.1.2、JDK8(storm不喜欢JDK9编译代码)、Kafka0.11和DockerCompose制作一个spring应用程序。
其想法是拥有一个容器化服务,可以接收rest调用来创建storm拓扑,然后将它们提交给storm集群。一切都在本地工作,但将拓扑提交从提交到本地集群移动到 StormSubmitter 正在引发问题。我已经解决了大部分问题,但是有一个奇怪的序列化问题。
我有一个能读Kafka作品的喷口。它读取protobuf对象的字节数组,并使用自定义反序列化程序从中创建消息。我有两个不同的螺栓从这个喷口读取,一个打印传入消息(螺栓a),另一个根据字段过滤消息并将它们发送到另一个要聚合的螺栓(螺栓b)。
我注意到的两个螺栓之间的唯一区别是螺栓b有一个构造函数,而螺栓a没有。
出于某种原因,bolt a接收来自喷口的消息并打印它们没有问题,但是每当消息到达bolt b时,它就会抛出一个异常 com.esotericsoftware.kryo.KryoException: Class cannot be created (missing no-arg constructor): my.package.MyProtobufMessage . 我看到您可以为类注册序列化程序,但是为什么bolt a能够处理消息而bolt b不能呢?
另外还有一个单独的问题,但是当我添加第三个拓扑时,nimbus没有给它分配一个管理器。一个拓扑将包含2个works和9个Exec,第二个拓扑将包含2个Worker和6个Exec,然后我将添加第三个拓扑,它将显示在ui和nimbus日志中,但不显示在supervisor日志中。在ui中,第三个拓扑将有0个worker、exec和0个分配的mem

gkn4icbw

gkn4icbw1#

你可能会“幸运”,因为喷口和螺栓a在同一个工人,而螺栓b在另一个工人。storm不会序列化元组,除非它们被传输到另一个worker,这可能是bolt a可以读取消息的原因。
关于第三个拓扑问题,您需要确保您的主管为您的拓扑拥有足够的工作机插槽。每个主管在storm配置(storm.yaml)中定义它愿意运行多少个worker JVM。我猜前两种拓扑占据了所有的插槽。
主管的默认配置为

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

它允许每个主管上有4个工作jvm。由于工作jvm不是共享的,如果您运行两个拓扑,每个拓扑占用两个工作机,那么您已经用完了所有的插槽。您可以添加更多的插槽或更多的管理计算机,或者减少拓扑所需的工作机数量。

相关问题