亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

apache Storm - 在單節點中正確運行 jar,但在多節點中不正確

apache Storm - 在單節點中正確運行 jar,但在多節點中不正確

海綿寶寶撒 2022-04-28 16:44:17
我是 apachestorm 的新手,我編寫了包含 1 個 spout 和 2 個 bolt 的代碼,當我在一個 worker 上運行這 3 個部分時,代碼會正確生成輸出,但是當我在 1 個 worker 執行的三個 worker 中運行代碼時spout,另一個運行螺栓 1 和最后一個運行螺栓 2,將不會生成輸出。具體情況:當我將螺栓1和2放在一個工人中時,產生了輸出!不得不說,發射成功了,發射變量沒有問題。詳細說明:我在螺栓 1 的哈希圖結構中創建了樹,我想在螺栓 2 中挖掘這棵樹。在螺栓 1 中插入樹中的對象的 id 就像“MyTreeNode@e70014d5”,當我收到這個元組時(哈希圖) 在螺栓 2 中,id 更改為類似“MyTreeNode@z5542r12”的內容。主要問題是什么?問題是因為更改了對象ID嗎?如果是,請告訴我如何解決?
查看完整描述

1 回答

?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

讓我們看一個示例拓撲。

假設您的拓撲變為 spout -> bolt1,并且您正在從 spout 發出 MyObject 實例。

假設您已將拓撲設置為在 1 個工作人員中運行。

當從 spout 發出一個元組(例如 MyObject@1234)時,Storm 將檢查該元組是否需要轉到另一個工作人員。如果沒有,它只是將對象引用傳遞給bolt1。這就是您只有 1 個工人時所看到的。當 MyObject@1234 需要從 spout 轉移到 bolt 時,Storm 只是將 MyObject@1234 引用交給 bolt。

現在假設你告訴拓撲使用 2 個 worker,Storm 決定將 spout 放在 worker 1 中,將 bolt 放在 worker 2 中?;叵胍幌?,每個 worker 都是一個單獨的 JVM 進程,因此將對象引用從 worker 1 傳遞給 worker 2不會工作。

當元組從 spout 發出時,Storm 將看到它正在發送給另一個工作人員,并根據您的配置使用 Kryo 或 Java 序列化對其進行序列化。這意味著 MyObject@1234 被序列化。Storm 將序列化的表單交給 worker 2,后者將其反序列化。當它被反序列化時,它被非常合理地賦予了一個新的內存地址(例如MyObject@6789)。

如果您設計螺栓以假設它們不在同一個 JVM 中運行,這不是問題,您絕對應該這樣做。例如,如果您想將 MyObject 從 worker 1 傳輸到 worker 2,您可以將其設為 Serializable,或者您可以將其注冊到 Kryo(參見https://storm.apache.org/releases/2.0.0-快照/序列化.html )。您需要這樣做,以便 Storm 可以將您的 spout 和 bolts 放在單獨的 JVM 中,而不會破壞您的拓撲。

測試拓撲時,應啟用https://storm.apache.org/releases/1.2.2/javadocs/org/apache/storm/Config.html#TOPOLOGY_TESTING_ALWAYS_TRY_SERIALIZE。這將導致 Storm 總是序列化你的元組,即使元組沒有在工作人員之間傳輸。這可以幫助您在序列化問題投入生產之前發現它們。

順便說一句,您應該始終更喜歡 Kryo 序列化而不是 Java 序列化。Kryo 序列化要快得多。


查看完整回答
反對 回復 2022-04-28
  • 1 回答
  • 0 關注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號