MapReduce算法–二級排序

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

  1. 使用MapReduce進行數據密集型文本處理
  2. 使用MapReduce進行數據密集型文本處理-本地聚合第二部分
  3. 使用Hadoop計算共現矩陣
  4. 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370240.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370240.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370240.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis 字符串(String)

Redis 字符串(String) Redis 字符串數據類型的相關命令用于管理 redis 字符串值&#xff0c;基本語法如下&#xff1a; 語法 redis 127.0.0.1:6379> COMMAND KEY_NAME 實例 redis 127.0.0.1:6379> SET runoobkey redis OK redis 127.0.0.1:6379> GET runoobkey "…

前端基礎-CSS的各種選擇器的特點以及CSS的三大特性

一、 基本選擇器二、 后代選擇器、子元素選擇器三、 兄弟選擇器四、 交集選擇器與并集選擇器五、 序列選擇器六、 屬性選擇器七、 偽類選擇器八、 偽元素選擇器九、 CSS三大特性 一、 基本選擇器 1、id選擇器 #1、作用&#xff1a;根據指定的id名稱&#xff0c;在當前界面中找…

Php流式 大文件,如何使用PHP解析XML大文件

如果使用 PHP 解析 XML 的話&#xff0c;那么常見的選擇有如下幾種&#xff1a;DOM、SimpleXML、XMLReader。如果要解析 XML 大文件的話&#xff0c;那么首先要排除的是 DOM&#xff0c;因為使用 DOM 的話&#xff0c;需要把整個文件全部加載才能解析&#xff0c;效率堪憂&…

python 白盒測試_白盒測試教程 - 顏麗的個人空間 - OSCHINA - 中文開源技術交流社區...

總共貼了39節&#xff0c;后續還有很長&#xff0c;共122節&#xff0c;文章名為‘白盒測試教程’1、白盒測試概念2、測試覆蓋標準3、邏輯驅動測試4、基本路徑測試白盒測試概念1、白盒測試也稱結構測試或邏輯驅動測試&#xff0c;是一種測試用例設計方法&#xff0c;它從程序的…

Oracle 分析函數及常用函數

什么叫分析函數(Analytic function)&#xff1f; Oracle從8.1.6開始提供分析函數&#xff0c;分析函數用于計算基于組的某種聚合值&#xff0c;它和聚合函數的不同之處是 對于每個組返回多行&#xff0c;而聚合函數對于每個組只返回一行。 基本語法 function_name(arg1,arg2,..…

ScanTailor-ScanTailor 強大的多方位的滿足處理掃描圖片的需求

ScanTailor 強大的多方位的滿足處理掃描圖片的需求ScanTailor 能做什么&#xff1f;批量或單張或選擇區間旋轉圖片自動切割頁面&#xff0c;同時提供手動選項自動識別圖像歪斜角度&#xff0c;同時提供手動選項自動識別正文內容裁剪&#xff0c;同時提供手動選項設置正文上下左…

使用JavaCV進行手和手指檢測

這篇文章是Andrew Davison博士發布的有關自然用戶界面&#xff08;NUI&#xff09;系列的一部分&#xff0c;內容涉及使用JavaCV從網絡攝像頭視頻提要中檢測手。 注意&#xff1a;可以從http://fivedots.coe.psu.ac.th/~ad/jg/nui055/下載本章的所有源代碼。 第5章的彩色斑點檢…

oracle+trace參數設置,Oracle autotrace參數詳解

SQL> set autotrace traceonly explainSP2-0613: 無法驗證 PLAN_TABLE 格式或實體cuug每周五晚8點都有免費網絡課程&#xff0c;如需了解可點擊cuug官網。SP2-0611: 啟用EXPLAIN報告時出錯解決方法&#xff1a;1. 以SYS用戶登錄CONNECT / as SYSDBA ;1. 創建PLAN_TABL…

git提交代碼到碼云

日常代碼一般提交到github比較多&#xff0c;但我還是鐘愛馬爸爸&#xff0c;沒錯就是碼云。 碼云是中文版的代碼托管的網站&#xff0c;不存在打開網速問題&#xff0c;使用也蠻方便的&#xff0c;日常自己保存托管代碼已經足夠&#xff0c;平時使用git提交代碼到碼云是非常方…

不能裝載文檔控件。請在檢查瀏覽器的選項中檢查瀏覽器的安全設置_【2020年網絡安全宣傳周】如何正確設置瀏覽器...

李夏是一個公司的職員&#xff0c;一天晚上加班趕制文檔&#xff0c;由于要向客戶匯報產品情況&#xff0c;需要獲取大量網上信息&#xff0c;然而在制作中卻發現瀏覽器的網頁打不開了。第二天原計劃向客戶展示的材料未能完整匯總&#xff0c;客戶見面對接效果也打了折扣。在當…

矩形碰撞檢測和圓形碰撞檢測。

矩形碰撞檢測&#xff1a; <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Document</title><style type"text/css">body { margin: 0;}#wrap { margin: 50px auto; position: re…

MonogoDB 查詢小結

MonogoDB是一種NoSQL數據庫 優點: 1.數據的存儲以json的文檔進行存儲(面向文檔存儲) 2.聚合框架查詢速度快 3.高效存儲二進制大對象 缺點: 1.不支持事務 2.文件存儲空間占用過大 案例學習 例1:單個變量查詢(查找出制造商字段為“Porsche”的所有汽車的查詢) {"layout"…

用裝飾器設計模式裝飾

裝飾圖案是廣泛使用的結構圖案之一。 此模式在運行時動態更改對象的功能&#xff0c;而不會影響對象的現有功能。 簡而言之&#xff0c;此模式通過包裝將附加功能添加到對象。 問題陳述&#xff1a; 想像一下我們有一個比薩餅&#xff0c;該比薩餅已經用番茄和奶酪烤制的情況。…

linux 內存強度測試軟件,linux下的CPU、內存、IO、網絡的壓力測試工具與方法介紹...

使用工具stressCentos# yum -y install stressUbantu# apt-get install stress# stress --helpstress imposes certain types of compute stress on your systemUsage: stress [OPTION [ARG]] ...-?, --help show this help statement--version show version statement-v, --v…

vcpkg安裝_微軟牌包管理器vcpkg更新及路線圖計劃

蝎子vcpkg是一套跨平臺&#xff0c;開源的C/C庫管理器&#xff0c;今天的這篇文章是有關vcpkg主題的2020年4月博文更新。在這篇文章中&#xff0c;我們將分享有關vcpkg 2020.04發布版本的一些信息以及vcpkg的路線圖(roadmap)&#xff0c;我們會在這里持續地發布有關vcpkg的最新…

CSS 盒模型與box-sizing

一、盒模型 一個web頁面由許多html元素組成&#xff0c;而每一個html元素都可以表示為一個矩形的盒子&#xff0c;CSS盒模型正是描述這些矩形盒子的存在。 MDN的描述&#xff1a; When laying out a document, the browsers rendering engine represents each element as a r…

Java課程設計 購物車系統(個人博客) 201521123052 藍錦明

1. 團隊課程設計博客鏈接 課程設計團隊博客 2. 個人負責模塊或任務說明 &#xff08;1&#xff09;制作圖形菜單引導界面 &#xff08;2&#xff09;定義各獲取和輸出類函數 3. 自己的代碼提交記錄截圖 4. 自己負責模塊或任務詳細說明 import java.text.NumberFormat; public c…

7-12(圖) 社交網絡圖中結點的“重要性”計算(30 分)

在社交網絡中&#xff0c;個人或單位&#xff08;結點&#xff09;之間通過某些關系&#xff08;邊&#xff09;聯系起來。他們受到這些關系的影響&#xff0c;這種影響可以理解為網絡中相互連接的結點之間蔓延的一種相互作用&#xff0c;可以增強也可以減弱。而結點根據其所處…

linux系統的安裝程序,Linux系統安裝

為了不影響本機系統&#xff0c;建議在虛擬機上創建并安裝Linux系統&#xff0c;本次安裝centos7 64位的鏡像。詳細步驟如下&#xff1a;1、首先在虛擬機主頁創建新的虛擬機。... 圖1.1 2、選擇自定義安裝&#xff0c;這樣方便我們更好了解虛擬機&#xff0c;然后點擊下一步。.…

REST與Apache Camel

在Camel中公開HTTP終結點的方法有很多&#xff1a;jetty&#xff0c;tomcat&#xff0c;servlet&#xff0c;cxfrs和restlet。 其中的兩個組件– cxfrs和restlet也只需幾行代碼即可支持REST語義。 這個簡單的示例演示了如何使用camel-restlet和camel-jdbc進行CRUD操作。 四個HT…