[英]MapReduce output key in ascending order
我編寫了一個MapReduce代碼,其中鍵和值都是整數。 我正在使用單個Reducer。 輸出是這樣的:
Key Value
1 78
128 12
174 26
2 44
2957 123
975 91
是否有一種方法可以按鍵按升序對輸出進行排序? 這樣輸出看起來像這樣:
1 78
2 44
128 12
174 26
975 91
2957 123
我需要使用conf.setComparator
嗎? 如果是的話,我該怎么做?
這需要一個
TotalOrderPartitioner
它在M / R管道中強制執行另一個階段,將元素划分為已分類的存儲桶。
TreeMap解決方案不會全局工作,只能在每個Reducer中工作。
以下是顯示如何使用TotalOrderPartioner的要點(不是我的): https ://gist.github.com/asimjalis/e5627dc2ff2b23dac70b
要點的關鍵要點是:
a)你需要調用reducer.setPartitionerClass到TotalOrderPartitioner:
// Use Total Order Partitioner.
reduceJob.setPartitionerClass(TotalOrderPartitioner.class);
b)您需要生成一組拆分以用作TOP的“桶”
// Generate partition file from map-only job's output.
TotalOrderPartitioner.setPartitionFile(
reduceJob.getConfiguration(), partitionPath);
InputSampler.writePartitionFile(reduceJob, new InputSampler.RandomSampler(
1, 10000));
我在這里看到三個選項:
(並且首選)使用javadba的答案 (來自我的+1)。 這更通用,但需要更多努力。
如果可以,只需使用一個減速器。 這要求所有數據都可以放入單個機器的內存中。 然后,單個減速器的輸入將按鍵的升序排序(您想要的)。
作業完成后,您可以使用hdfs的getmerge
命令,然后手動對合並文件進行排序,例如,使用Linux的sort
命令 (甚至合並排序多個文件,不使用getmerge
命令)。 畢竟,您不必為所有事情使用MapReduce! 小心只根據鍵進行排序! 例如,您可以運行:
sort -n -k1,1 filename
但是還有更多的排序選項......
作為最后的注釋(完成)以上所有假設您不使用僅映射作業,其中輸出未排序。 如果是這種情況,我只能看到選項3工作。
更新 :為了將來參考並基於注釋,似乎輸出鍵不是IntWritable
類型,因此它們不被排序為整數。
使用TreeMap
。 它是為此而創建的:
基於紅黑樹的NavigableMap實現。 地圖根據其鍵的自然順序進行排序 ,或者根據使用的構造函數在地圖創建時提供的比較器進行排序 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.