2014-06-25 140 views
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]} 

我撞我有爲什麼它不會在第二種情況下工作。 此外,輸出結果比下一個輸出要多得多。

任何想法爲什麼這樣?

回答

0

我發現的唯一解決方案是在發送之前將HashMap轉換爲字符串,然後再轉換回螺栓中的HashMap。

+0

你是如何將值添加到地圖的?問題主要在那裏。在相同的JVM中,bolt和spout保持相同的java實例(我認爲沒有用於優化的kryo序列化),在從元組寫入/讀取時注意併發性問題(特別是非併發hashmap)!您的修復程序基本上是一個元組值的深層副本,用於抑制任何併發問題(這裏沒有內存參考)。 – zenbeni

+0

哈希表是螺栓本地的。所以沒有併發問題。 –

+0

不,你錯了:如果你從元組中獲得hashmap,這意味着它已經從另一個元素(螺栓/噴口)推出,然後構建它/修改它:它在同一個JVM中是「共享的」。 – zenbeni

相關問題