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 序列化要快得多。
添加回答
舉報