Storm bolt无法从spout反序列化对象

问题描述 投票:0回答:1

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

我们的想法是拥有一个容器化服务,可以接收REST调用来创建风暴拓扑,然后将它们提交给风暴集群。一切都在本地工作,但将拓扑提交从提交到本地群集到StormSubmitter正在引发问题。我已经解决了大部分问题,但是有一个奇怪的序列化问题。

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

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

由于某种原因,螺栓A从喷口接收消息并打印它们没有任何问题,但每次消息到达螺栓B时它会抛出异常com.esotericsoftware.kryo.KryoException: Class cannot be created (missing no-arg constructor): my.package.MyProtobufMessage。我看到你可以为类注册序列化器,但是为什么当螺栓B不能时,螺栓A能够处理消息?

另外 - 单独的问题,但是当我添加第三个拓扑时,灵气不会为它分配监督。一个拓扑结构将包含2个工作和9个执行器,第二个拓扑结构将包含2个工作人员和6个执行者,然后我将添加第三个拓扑结构,该拓扑结构将显示在UI和Nimbus日志中,但不会显示在管理程序日志中。在UI中,第三个拓扑将具有0个worker,execs和0个指定的mem

java apache-kafka apache-storm apache-storm-topology
1个回答
1
投票

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

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

主管的默认配置是

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

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

© www.soinside.com 2019 - 2024. All rights reserved.