0
我在項目中使用Twitter Storm,我有一個奇怪的問題。 我有以下nextTuple代碼壺嘴:Twitter風暴,爲什麼螺栓沒有收到噴口發送的東西
public void nextTuple()
{
HashMap cluster = this.databaseManager.getCluster();
System.out.println("emitted: " + cluster);
this.collector.emit(new Values(cluster));
}
和螺栓連接到這個壺嘴有以下執行:
public void execute(Tuple tuple)
{
HashMap<String, List<String>> unigrams = (HashMap)tuple.getValueByField("unigrams");
System.out.println("received: " + unigrams);
}
什麼是發射應該是一樣什麼是收到對? 因此,在第一輸出顯示此:
emitted: {218460=[04ef110987074dc6b3e3174b9f57d980], 1702472=[04ef110987074dc6b3e3174b9f57d980]}
received: {218460=[04ef110987074dc6b3e3174b9f57d980], 1702472=[04ef110987074dc6b3e3174b9f57d980]}
(它是什麼不敬的數據意味着,該點是,它是發射和接收)。 但隨後,當發射的改變時,接收到的是相同的:
emitted: {13788873=[aa2ec732b5b64b25be81abe79d2176bb], 2293158=[aa2ec732b5b64b25be81abe79d2176bb], 218460=[04ef110987074dc6b3e3174b9f57d980], 1702472=[04ef110987074dc6b3e3174b9f57d980]}
received: {218460=[04ef110987074dc6b3e3174b9f57d980], 1702472=[04ef110987074dc6b3e3174b9f57d980]}
我撞我有爲什麼它不會在第二種情況下工作。 此外,輸出結果比下一個輸出要多得多。
任何想法爲什麼這樣?
你是如何將值添加到地圖的?問題主要在那裏。在相同的JVM中,bolt和spout保持相同的java實例(我認爲沒有用於優化的kryo序列化),在從元組寫入/讀取時注意併發性問題(特別是非併發hashmap)!您的修復程序基本上是一個元組值的深層副本,用於抑制任何併發問題(這裏沒有內存參考)。 – zenbeni
哈希表是螺栓本地的。所以沒有併發問題。 –
不,你錯了:如果你從元組中獲得hashmap,這意味着它已經從另一個元素(螺栓/噴口)推出,然後構建它/修改它:它在同一個JVM中是「共享的」。 – zenbeni