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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

MapReduce算法–二级排序

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

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

  • 使用MapReduce進行數據密集型文本處理
  • 使用MapReduce進行數據密集型文本處理-本地聚合第二部分
  • 使用Hadoop計算共現矩陣
  • MapReduce算法–順序反轉


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

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

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

    值到密鑰轉換

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

    映射器代碼

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

    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);}} }

    現在,我們已將溫度添加到密鑰中,我們為啟用輔助排序做好了準備。 剩下要做的就是在必要時編寫考慮溫度的代碼。 在這里,我們有兩個選擇,編寫一個Comparator或在TemperaturePair類上調整compareTo方法(TemperaturePair實現WritableComparable)。 在大多數情況下,我建議您編寫一個單獨的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;}

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

    合伙人代碼

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

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

    盡管自定義分區程序保證了年和月的所有數據都到達同一精簡程序,但我們仍然需要考慮精簡程序將按鍵對記錄進行分組的事實。

    分組比較器

    數據到達精簡器后,所有數據均按鍵分組。 由于我們有一個復合鍵,因此我們需要確保記錄僅按自然鍵分組。 這是通過編寫自定義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());} }

    結果

    這是運行我們的二級排序作業的結果:

    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

    結論

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

    資源資源

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

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

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

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 成人免费一区二区三区 | 亚洲人成电影网站 | 亚洲国产日韩在线观看 | 亚洲美女视频一区 | 日本aⅴ片| av私库在线观看 | 色哟哟免费在线观看 | 蜜桃视频一区 | www.久热| 9999热视频| 久久国内免费视频 | 狠狠躁日日躁夜夜躁 | 日日舔夜夜摸 | 特大黑人巨交吊性xxxxhd | 久热精品视频在线观看 | 最近中文字幕在线观看 | 无遮挡边吃摸边吃奶边做 | 91漂亮少妇露脸在线播放 | 欧美一区在线看 | 人妻与黑人一区二区三区 | 日韩丰满少妇无码内射 | 3344av| 久久精品激情 | 欧美日韩中文一区 | 91刺激视频 | 亚洲午夜福利在线观看 | 欧美顶级metart裸体全部自慰 | 日本精品在线视频 | 91九色在线观看 | 全球av在线 | 色爽爽一区二区三区 | 91九色蝌蚪porny | 日韩一区二区三免费高清在线观看 | 激情福利 | 超碰人人国产 | 古代玷污糟蹋np高辣h文 | 亚洲天堂男人的天堂 | 国产一卡二卡在线 | 亚洲热影院| 亚洲男人天堂2020 | 日韩亚洲影院 | 黄色片子看看 | 免费黄色小视频网站 | 最近中文字幕第一页 | 超碰在线中文 | 欧美特级黄色 | 日韩欧美影院 | 久久久久久久国产精品视频 | 国产精品一二三区在线观看 | 欧美精品v国产精品v日韩精品 | 国产成人自拍一区 | 天堂av资源网| 亚洲区在线播放 | 亚洲成人h | 国产女主播自拍 | 狂野欧美性猛交xxxxhd | 国产女人水真多18毛片18精品 | 性爱动漫 | 91制服诱惑| 亚洲a∨无码无在线观看 | 狠狠干老司机 | 亚洲av乱码久久精品蜜桃 | 丰满双乳秘书被老板狂揉捏 | 高潮又黄又刺激 | 一区二区三区四区在线观看视频 | 黄色在线免费观看视频 | 日韩成人动漫在线观看 | av先锋资源 | 国产精选网站 | 91福利小视频| 亚洲成人播放器 | 最新免费av网站 | 三年在线观看视频 | 色xxxxxx| 天堂av2019| 美女福利片 | 18被视频免费观看视频 | 成人精品在线观看 | 色婷婷久久久亚洲一区二区三区 | youjizz亚洲| 久久亚洲私人国产精品va | 亚洲高清视频免费观看 | 精品一区二区三区四区五区 | 佐山爱av在线 | 日本va视频 | 日韩中文字幕一区二区三区 | 国产香蕉尹人视频在线 | 久久午夜夜伦鲁鲁一区二区 | av无码久久久久久不卡网站 | 五月开心婷婷 | 亚洲夜夜爽 | 久久人人爽人人人人片 | 一区二区三区四区欧美 | 污污的网站在线免费观看 | 99视频精品在线 | 亚洲一区免费 | 爱操av | 极度诱惑香港电影完整 | 国产一区2|