2012-08-04 40 views
1

我有以下問題:我有大量的鍵值對形式的數據。關鍵是一些id和價值 - 一些文字。我的目標是將這些對象以文本片段以某種方式「相似」分組。所以它看起來像是MapReduce的一項任務,如果將我的文本片段作爲關鍵字,並將id作爲值。但是這樣的密鑰並不是傳統的MapReduce使用方式,而且我也沒有真正意識到MapReduces框架的內部實現,所以我不確定這種方式是否有效。所以我的想法詳細是: 1.在Java中採用一些MapReduce(Hadoop,GridGain) 2.爲我的文本塊創建特殊類(如TextKey) 3.覆蓋類的equals(),打包文本比較邏輯(比如levenstein距離比較,或者其他) 4.重寫compareTo()允許MapReduce按鍵排序(比如說詞典排序) 5.可能覆蓋hashCode() 6.將我的數據映射到鍵值對:鍵 - >文本塊,包裝在TextKey類中,值 - > IDs 7.簡單地通過收集每個「相等」(實際上相似的)鍵的ID來減少MapReduce與「定製」鍵

MapReduce可以以這種方式工作嗎?右邊的地圖階段之後

回答

0
  1. ,其輸出使用分區程序分區(HashPartitioner默認,但你可以提供自己的Parititioner)。你的TextKey應該實現一個LSH hashCode,以便類似的Text值可能會進入同一個分區。

  2. 如果鍵是字符串/文本對象,默認排序器將工作,但我認爲這不會影響您的結果給出你描述的情況。

  3. 問題在於Grouper將分區內的每個組傳遞給單個reduce調用。默認情況下,這個分組器遍歷按這個時刻排序的分區,它形成了等值的分組。在你的情況下,你應該確保分組不是平等的,而是相似的。所以,你的TextKey也應該實現compareTo()方法,並且在LSH hashCode相同的情況下注意返回0。

總之,你可以使用默認的數據路徑去(即默認分區程序,分揀機,石斑魚),但您的TextKey(這應該實現WritableComparable)應該做的hashCode()compareTo()方法神奇

3

在通過將文本鍵存儲在分區數據網格中,可以輕鬆解決GridGain問題。 GridGain數據網格會根據密鑰自動將數據集劃分到集羣中,所以只要你有相似的文本部分正確地實現了標準的java hashCode()和equals(),你應該沒問題。

您還可以在GridGain中發送基於親和力的MapReduce任務,以確保您的作業最終位於與數據相同的節點上,以避免在您需要對數據執行一些計算時發生冗餘數據移動。這可以通過執行GridProjection.affinityRun(...)方法來實現。