gpt4 book ai didi

java - Storm Bolt 无法从 Spout 反序列化对象

转载 作者:行者123 更新时间:2023-12-02 10:49:07 31 4
gpt4 key购买 nike

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

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

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

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

出于某种原因, bolt A 可以毫无问题地从 spout 接收消息并打印它们,但每次消息到达 bolt B 时,它都会抛出异常 com.esotericsoftware.kryo.KryoException:无法创建类(缺少 no -arg 构造函数):my.package.MyProtobufMessage。我看到您可以为类注册序列化器,但为什么 bolt A 能够处理消息,而 bolt B 却不能?

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

最佳答案

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

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

主管的默认配置是

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

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

关于java - Storm Bolt 无法从 Spout 反序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52316279/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com