簡體   English   中英

MapReduce輸出鍵按升序排列

[英]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

https://hadoop.apache.org/docs/r2.4.1/api/org/apache/hadoop/mapreduce/lib/partition/TotalOrderPartitioner.html

它在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));

我在這里看到三個選項:

  1. (並且首選)使用javadba的答案 (來自我的+1)。 這更通用,但需要更多努力。

  2. 如果可以,只需使用一個減速器。 這要求所有數據都可以放入單個機器的內存中。 然后,單個減速器的輸入將按鍵的升序排序(您想要的)。

  3. 作業完成后,您可以使用hdfs的getmerge命令,然后手動對合並文件進行排序,例如,使用Linux的sort命令 (甚至合並排序多個文件,不使用getmerge命令)。 畢竟,您不必為所有事情使用MapReduce! 小心只根據鍵進行排序! 例如,您可以運行:

     sort -n -k1,1 filename 

    但是還有更多的排序選項......

作為最后的注釋(完成)以上所有假設您不使用僅映射作業,其中輸出未排序。 如果是這種情況,我只能看到選項3工作。

更新 :為了將來參考並基於注釋,似乎輸出鍵不是IntWritable類型,因此它們不被排序為整數。

使用TreeMap 它是為此而創建的:

基於紅黑樹的NavigableMap實現。 地圖根據其鍵的自然順序進行排序 ,或者根據使用的構造函數在地圖創建時提供的比較器進行排序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM