簡體   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