日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MapReduce算法–二级排序

發(fā)布時間:2023/12/3 编程问答 69 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MapReduce算法–二级排序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們將繼續(xù)進行有關實現(xiàn)MapReduce算法的系列文章,該系列可在使用MapReduce進行數(shù)據(jù)密集型文本處理中找到。 本系列的其他文章:

  • 使用MapReduce進行數(shù)據(jù)密集型文本處理
  • 使用MapReduce進行數(shù)據(jù)密集型文本處理-本地聚合第二部分
  • 使用Hadoop計算共現(xiàn)矩陣
  • MapReduce算法–順序反轉(zhuǎn)


  • 這篇文章介紹了在使用MapReduce進行數(shù)據(jù)密集型文本處理的第3章中找到的二級排序模式。 雖然Hadoop在將映射器發(fā)出的數(shù)據(jù)自動排序后再發(fā)送給reducer,但是如果您還想按值排序怎么辦? 您當然會使用二級排序。 通過稍加操作鍵對象的格式,二級排序使我們能夠在排序階段將值考慮在內(nèi)。 這里有兩種可能的方法。

    第一種方法涉及讓減速器緩沖給定鍵的所有值,并對這些值進行歸約器排序。 由于減速器將接收給定鍵的所有值,因此此方法可能會導致減速器內(nèi)存不足。

    第二種方法涉及通過向自然鍵添加部分或整個值來創(chuàng)建組合鍵,以實現(xiàn)您的排序目標。 這兩種方法之間的權(quán)衡是對reducer中的值進行顯式排序,這很可能會更快(存在內(nèi)存不足的風險),但實現(xiàn)“值到鍵”轉(zhuǎn)換方法會減輕MapReduce框架的排序工作,這是Hadoop / MapReduce設計要做的核心。 出于本文的目的,我們將考慮“關鍵價值”方法。 我們將需要編寫一個自定義分區(qū)程序,以確保所有具有相同鍵(自然鍵不包含帶有值的復合鍵)的數(shù)據(jù)都發(fā)送到相同的reducer和自定義比較器,以便一旦數(shù)據(jù)被自然鍵分組到達減速機。

    值到密鑰轉(zhuǎn)換

    直接創(chuàng)建復合鍵。 我們需要做的是分析在排序過程中要考慮值的哪一部分,并將適當?shù)牟糠痔砑拥阶匀绘I中。 然后,我們需要在鍵類或比較器類中使用compareTo方法,以確保對組合鍵進行了說明。 我們將重新訪問天氣數(shù)據(jù)集,并將溫度作為自然鍵的一部分(自然鍵是年和月連接在一起)的一部分。 結(jié)果將是給定月份和年份中最冷的一天的列表。 該示例的靈感來自Hadoop,《權(quán)威指南》一書中的二級排序示例。 盡管可能有更好的方法可以實現(xiàn)此目標,但它足以說明次級排序的工作原理。

    映射器代碼

    我們的映射器代碼已經(jīng)將年和月連接在一起,但是我們還將把溫度作為鍵的一部分。 由于我們將值包含在鍵本身中,因此映射器將發(fā)出NullWritable,在其他情況下,我們將發(fā)出溫度。

    public class SecondarySortingTemperatureMapper extends Mapper<LongWritable, Text, TemperaturePair, NullWritable> {private TemperaturePair temperaturePair = new TemperaturePair();private NullWritable nullValue = NullWritable.get();private static final int MISSING = 9999; @Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String line = value.toString();String yearMonth = line.substring(15, 21);int tempStartPosition = 87;if (line.charAt(tempStartPosition) == '+') {tempStartPosition += 1;}int temp = Integer.parseInt(line.substring(tempStartPosition, 92));if (temp != MISSING) {temperaturePair.setYearMonth(yearMonth);temperaturePair.setTemperature(temp);context.write(temperaturePair, nullValue);}} }

    現(xiàn)在,我們已將溫度添加到密鑰中,我們?yōu)閱⒂幂o助排序做好了準備。 剩下要做的就是在必要時編寫考慮溫度的代碼。 在這里,我們有兩個選擇,編寫一個Comparator或在TemperaturePair類上調(diào)整compareTo方法(TemperaturePair實現(xiàn)WritableComparable)。 在大多數(shù)情況下,我建議您編寫一個單獨的Comparator,但是TemperaturePair類是專門為演示二次排序而編寫的,因此我們將修改TemperaturePair類的compareTo方法。

    @Overridepublic int compareTo(TemperaturePair temperaturePair) {int compareValue = this.yearMonth.compareTo(temperaturePair.getYearMonth());if (compareValue == 0) {compareValue = temperature.compareTo(temperaturePair.getTemperature());}return compareValue;}

    如果我們想按降序排序,我們可以簡單地將溫度比較的結(jié)果乘以-1。
    現(xiàn)在,我們已經(jīng)完成了排序所必需的部分,我們需要編寫一個自定義分區(qū)程序。

    合伙人代碼

    為了確保在確定將哪個縮減程序發(fā)送數(shù)據(jù)時僅考慮自然鍵,我們需要編寫一個自定義分區(qū)程序。 該代碼簡單明了,在計算將數(shù)據(jù)發(fā)送到的減速器時,僅考慮TemperaturePair類的yearMonth值。

    public class TemperaturePartitioner extends Partitioner<TemperaturePair, NullWritable>{@Overridepublic int getPartition(TemperaturePair temperaturePair, NullWritable nullWritable, int numPartitions) {return temperaturePair.getYearMonth().hashCode() % numPartitions;} }

    盡管自定義分區(qū)程序保證了年和月的所有數(shù)據(jù)都到達同一精簡程序,但我們?nèi)匀恍枰紤]精簡程序?qū)存I對記錄進行分組的事實。

    分組比較器

    數(shù)據(jù)到達精簡器后,所有數(shù)據(jù)均按鍵分組。 由于我們有一個復合鍵,因此我們需要確保記錄僅按自然鍵分組。 這是通過編寫自定義GroupPartitioner完成的。 為了將記錄分組在一起,我們只考慮了TemperaturePair類的yearMonth字段的Comparator對象。

    public class YearMonthGroupingComparator extends WritableComparator {public YearMonthGroupingComparator() {super(TemperaturePair.class, true);}@Overridepublic int compare(WritableComparable tp1, WritableComparable tp2) {TemperaturePair temperaturePair = (TemperaturePair) tp1;TemperaturePair temperaturePair2 = (TemperaturePair) tp2;return temperaturePair.getYearMonth().compareTo(temperaturePair2.getYearMonth());} }

    結(jié)果

    這是運行我們的二級排序作業(yè)的結(jié)果:

    new-host-2:sbin bbejeck$ hdfs dfs -cat secondary-sort/part-r-00000 190101 -206 190102 -333 190103 -272 190104 -61 190105 -33 190106 44 190107 72 190108 44 190109 17 190110 -33 190111 -217 190112 -300

    結(jié)論

    雖然按值對數(shù)據(jù)進行排序可能不是普遍的需求,但是在需要時,這是個不錯的工具。 此外,通過使用自定義分區(qū)程序和組分區(qū)程序,我們能夠更深入地了解Hadoop的內(nèi)部工作原理。 感謝您的時間。

    資源資源

    • Jimmy Lin和Chris Dyer 使用MapReduce進行的數(shù)據(jù)密集型處理
    • Hadoop: Tom White 的權(quán)威指南
    • 來自博客的源代碼和測試
    • Hadoop API
    • MRUnit用于單元測試Apache Hadoop映射減少工作

    參考: MapReduce算法–來自我們的JCG合作伙伴 Bill Bejeck的“ 二級排序”,來自“ 隨機編碼思考”博客。

    翻譯自: https://www.javacodegeeks.com/2013/01/mapreduce-algorithms-secondary-sorting.html

    總結(jié)

    以上是生活随笔為你收集整理的MapReduce算法–二级排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。