此問題涉及Map/Reduce排序。我有三個字段MapReduce根據三個字段進行排序
XXID, Identifier, TimeStamp
的XXID可以任何字符串值,該標識符得到了兩個可能的值1或2
我想要的排序,以使得所有的相同XXID轉到同一減速在迭代中,帶有1的字段在迭代中首先隨着時間戳增加而接下來是2的字段。
有人可以幫我嗎?
此問題涉及Map/Reduce排序。我有三個字段MapReduce根據三個字段進行排序
XXID, Identifier, TimeStamp
的XXID可以任何字符串值,該標識符得到了兩個可能的值1或2
我想要的排序,以使得所有的相同XXID轉到同一減速在迭代中,帶有1的字段在迭代中首先隨着時間戳增加而接下來是2的字段。
有人可以幫我嗎?
你肯定會違反mapreduce框架來做到這一點,但你必須做你必須做的!
首先,排序只在鍵上完成。因此,您必須假定這些值將按任意順序排列。因此,我們需要弄清楚如何將XXID,標識符和時間戳全部集中在一起。 (你現在可以直接使用NullWriteable作爲值)
要將三個項目放到一個鍵中,你應該通過實現WriteableComparable來創建一個新的數據類型。讓這個新課程包裝三個值,我們稱之爲JavanxTriple
。
您要自定義MapReduce類別JavanxTriple
項目的方法是將.compareTo
函數從Comparable更改爲。使其成爲XXID首先比較,然後1或2,然後時間戳。
接下來,你需要解決的是,由於每一個這些東西都是獨立的按鍵,在默認情況下的數據會去不同的減速問題。開箱即用,您將無法計算您想要的數據流。爲了解決這個問題,你需要編寫一個自定義的partitioner。分區程序告訴每個記錄要去哪個reducer。爲此,請覆蓋.getPartition
。在計算.getPartition
時,只能使用XXID來確定此號碼(不是密鑰的Identifier和TimeStamp部分)。他們的方式是,所有具有相同XXID的項目都被髮送到同一個減速器。
最後,你現在有一個問題,你實現reducer的方式將不會是典型的。 reduce只會被每個鍵調用一次,並且傳入的Iterable將只有一個NullWriteable。
爲了解決這個問題,在Reducer類中使用一些靜態變量來跟蹤reduce函數中發生的事情。您必須檢測XXID何時更改,以便知道切換下一個分析。你可能不得不使用setup and cleanup方法來設置和完成事情。
非常感謝您的回答。這就是我正在做的,並認爲可能會有更好的解決方案,看來這是一個需要解決的問題。 非常感謝您的回答。 – javanx
是的,不幸的是,只要你開始突破模具事情變得醜陋快速 –
要排序100GB數據和其他計算現在完成它需要50分鐘與9個數據節點和216個映射器。它被認爲是糟糕的表現? – javanx