MapReduce:處理數據密集型文本處理–局部聚合第二部分

這篇文章繼續進行有關使用MapReduce進行數據密集型處理的書中實現算法的系列文章。 第一部分可以在這里找到。 在上一篇文章中,我們討論了使用本地聚合技術來減少通過網絡進行混洗和傳輸的數據量的方法。 減少傳輸的數據量是提高MapReduce作業效率的主要方法之一。 單詞計數MapReduce作業用于演示本地聚合。 由于結果只需要總數,因此我們可以為合并器重新使用相同的化簡器,因為更改加數的順序或分組不會影響總和。

但是,如果您想要平均水平呢? 然后,由于計算平均值的平均值不等于原始數字集的平均值,因此相同的方法將行不通。 盡管有了一點見識,我們仍然可以使用本地聚合。 對于這些示例,我們將使用Hadoop最終指南書中使用的NCDC天氣數據集的示例。 我們將計算1901年每個月的平均溫度。可以在MapReduce的數據密集型處理的第3.1.3章中找到組合器和映射器內組合選項的平均值算法。

一種尺寸并不適合所有人

上一次,我們介紹了兩種用于在MapReduce作業中減少數據的方法:Hadoop組合器和映射器內組合方法。 Hadoop框架將組合器視為一種優化,并且無法保證調用組合器的次數(如果有的話)。 結果,映射器必須以減速器期望的形式發出數據,因此,如果不涉及組合器,則最終結果不會更改。 要針對計算平均值進行調整,我們需要返回到映射器并更改其輸出。

映射器更改

在單詞計數示例中,未優化的映射器僅發出單詞和1的計數。合并器和映射器內組合映射器通過將每個單詞保留為哈希映射中的鍵(總計數為n)來優化此輸出。值。 每次看到一個單詞,計數都將增加1。在這種設置下,如果未調用組合器,則縮減器將接收到該單詞作為鍵,并將一長串的1?s加在一起,從而得到相同的輸出(當然,使用映射器內組合映射器可以避免此問題,因為可以保證合并結果是映射器代碼的一部分)。 為了計算平均值,我們將使基本映射器發出一個字符串鍵(將天氣觀測的年和月連接在一起)和一個自定義可寫對象,稱為TemperatureAveragingPair。 TemperatureAveragingPair對象將包含兩個數字(IntWritables),獲取的溫度和一個計數。 我們將從Hadoop:權威指南中獲取MaximumTemperatureMapper,并以此為靈感來創建AverageTemperatureMapper:

public class AverageTemperatureMapper extends Mapper<LongWritable, Text, Text, TemperatureAveragingPair> {//sample line of weather data//0029029070999991901010106004+64333+023450FM-12+000599999V0202701N015919999999N0000001N9-00781+99999102001ADDGF10899199999999999private Text outText = new Text();private TemperatureAveragingPair pair = new TemperatureAveragingPair();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) {outText.set(yearMonth);pair.set(temp, 1);context.write(outText, pair);}}
}

通過使映射器輸出鍵和TemperatureAveragingPair對象,無論調用組合器如何,我們的MapReduce程序都可以保證具有正確的結果。

合路器

我們需要減少發送的數據量,因此我們將對溫度求和,對計數求和并分別存儲。 這樣,我們將減少發送的數據,但保留計算正確平均值所需的格式。 如果/在調用組合器時,它將采用所有傳入的TemperatureAveragingPair對象,并為同一鍵發出單個TemperatureAveragingPair對象,其中包含溫度和計數值的總和。 這是合并器的代碼:

public class AverageTemperatureCombiner extends Reducer<Text,TemperatureAveragingPair,Text,TemperatureAveragingPair> {private TemperatureAveragingPair pair = new TemperatureAveragingPair();@Overrideprotected void reduce(Text key, Iterable<TemperatureAveragingPair> values, Context context) throws IOException, InterruptedException {int temp = 0;int count = 0;for (TemperatureAveragingPair value : values) {temp += value.getTemp().get();count += value.getCount().get();}pair.set(temp,count);context.write(key,pair);}
}

但是我們非常有興趣確保我們減少了發送到reducer的數據量,因此我們將看看下一步如何實現。

在Mapper合并平均值中

類似于單詞計數示例,為了計算平均值,映射器內組合映射器將使用哈希圖,將連接的年+月作為鍵,將TemperatureAveragingPair作為值。 每次獲得相同的年+月組合時,我們都會將對對象從地圖中取出,添加溫度并將計數增加一個。 調用cleanup方法后,我們將發出所有對及其各自的鍵:

public class AverageTemperatureCombiningMapper extends Mapper<LongWritable, Text, Text, TemperatureAveragingPair> {//sample line of weather data//0029029070999991901010106004+64333+023450FM-12+000599999V0202701N015919999999N0000001N9-00781+99999102001ADDGF10899199999999999private static final int MISSING = 9999;private Map<String,TemperatureAveragingPair> pairMap = new HashMap<String,TemperatureAveragingPair>();@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) {TemperatureAveragingPair pair = pairMap.get(yearMonth);if(pair == null){pair = new TemperatureAveragingPair();pairMap.put(yearMonth,pair);}int temps = pair.getTemp().get() + temp;int count = pair.getCount().get() + 1;pair.set(temps,count);}}@Overrideprotected void cleanup(Context context) throws IOException, InterruptedException {Set<String> keys = pairMap.keySet();Text keyText = new Text();for (String key : keys) {keyText.set(key);context.write(keyText,pairMap.get(key));}}
}

通過遵循在映射調用之間跟蹤數據的相同模式,我們可以通過實現映射器內合并策略來實現可靠的數據減少。 同樣的注意事項適用于在對映射器的所有調用中保持狀態,但是考慮使用這種方法可以提高處理效率,這是值得考慮的。

減速器

在這一點上,編寫我們的reducer很容易,為每個鍵列出一對配對,將所有溫度和計數求和,然后將溫度的總和除以計數的總和。

public class AverageTemperatureReducer extends Reducer<Text, TemperatureAveragingPair, Text, IntWritable> {private IntWritable average = new IntWritable();@Overrideprotected void reduce(Text key, Iterable<TemperatureAveragingPair> values, Context context) throws IOException, InterruptedException {int temp = 0;int count = 0;for (TemperatureAveragingPair pair : values) {temp += pair.getTemp().get();count += pair.getCount().get();}average.set(temp / count);context.write(key, average);}
}


結果

使用合并器和映射器內合并映射器選項可以預測結果,從而顯著減少數據輸出。
未優化的映射器選項:

12/10/10 23:05:28 INFO mapred.JobClient:     Reduce input groups=12
12/10/10 23:05:28 INFO mapred.JobClient:     Combine output records=0
12/10/10 23:05:28 INFO mapred.JobClient:     Map input records=6565
12/10/10 23:05:28 INFO mapred.JobClient:     Reduce shuffle bytes=111594
12/10/10 23:05:28 INFO mapred.JobClient:     Reduce output records=12
12/10/10 23:05:28 INFO mapred.JobClient:     Spilled Records=13128
12/10/10 23:05:28 INFO mapred.JobClient:     Map output bytes=98460
12/10/10 23:05:28 INFO mapred.JobClient:     Total committed heap usage (bytes)=269619200
12/10/10 23:05:28 INFO mapred.JobClient:     Combine input records=0
12/10/10 23:05:28 INFO mapred.JobClient:     Map output records=6564
12/10/10 23:05:28 INFO mapred.JobClient:     SPLIT_RAW_BYTES=108
12/10/10 23:05:28 INFO mapred.JobClient:     Reduce input records=6564

組合器選項:

12/10/10 23:07:19 INFO mapred.JobClient:     Reduce input groups=12
12/10/10 23:07:19 INFO mapred.JobClient:     Combine output records=12
12/10/10 23:07:19 INFO mapred.JobClient:     Map input records=6565
12/10/10 23:07:19 INFO mapred.JobClient:     Reduce shuffle bytes=210
12/10/10 23:07:19 INFO mapred.JobClient:     Reduce output records=12
12/10/10 23:07:19 INFO mapred.JobClient:     Spilled Records=24
12/10/10 23:07:19 INFO mapred.JobClient:     Map output bytes=98460
12/10/10 23:07:19 INFO mapred.JobClient:     Total committed heap usage (bytes)=269619200
12/10/10 23:07:19 INFO mapred.JobClient:     Combine input records=6564
12/10/10 23:07:19 INFO mapred.JobClient:     Map output records=6564
12/10/10 23:07:19 INFO mapred.JobClient:     SPLIT_RAW_BYTES=108
12/10/10 23:07:19 INFO mapred.JobClient:     Reduce input records=12

映射器內合并選項:

12/10/10 23:09:09 INFO mapred.JobClient:     Reduce input groups=12
12/10/10 23:09:09 INFO mapred.JobClient:     Combine output records=0
12/10/10 23:09:09 INFO mapred.JobClient:     Map input records=6565
12/10/10 23:09:09 INFO mapred.JobClient:     Reduce shuffle bytes=210
12/10/10 23:09:09 INFO mapred.JobClient:     Reduce output records=12
12/10/10 23:09:09 INFO mapred.JobClient:     Spilled Records=24
12/10/10 23:09:09 INFO mapred.JobClient:     Map output bytes=180
12/10/10 23:09:09 INFO mapred.JobClient:     Total committed heap usage (bytes)=269619200
12/10/10 23:09:09 INFO mapred.JobClient:     Combine input records=0
12/10/10 23:09:09 INFO mapred.JobClient:     Map output records=12
12/10/10 23:09:09 INFO mapred.JobClient:     SPLIT_RAW_BYTES=108
12/10/10 23:09:09 INFO mapred.JobClient:     Reduce input records=12

計算結果:
(注意:示例文件中的溫度以攝氏度* 10為單位)

未優化 合路器 映射器內合并器映射器
190101 -25
190102 -91
190103 -49 190104 22 190105 76 190106 146 190107 192 190108 170 190109 114 190110 86 190111 -16 190112 -77
190101 -25
190102 -91
190103 -49 190104 22 190105 76 190106 146 190107 192 190108 170 190109 114 190110 86 190111 -16 190112 -77
190101 -25
190102 -91
190103 -49 190104 22 190105 76 190106 146 190107 192 190108 170 190109 114 190110 86 190111 -16 190112 -77


結論

對于簡單的情況(可以將reducer重用為組合器)和更復雜的情況(對于如何構造數據同時仍能從本地聚集數據以提高處理效率)有所了解,我們已經介紹了本地聚集。

進一步閱讀

  • Jimmy Lin和Chris Dyer 使用MapReduce進行的數據密集型處理
  • Hadoop: Tom White 的權威指南
  • 來自博客的源代碼
  • Hadoop API
  • MRUnit用于單元測試Apache Hadoop映射減少工作
  • Gutenberg項目提供了大量純文本格式的書籍,非常適合在本地測試Hadoop作業。

參考: 使用MapReduce進行數據密集型文本處理-本地聚合第二部分,來自我們的JCG合作伙伴 Bill Bejeck,來自“ 隨機編碼思考”博客。


翻譯自: https://www.javacodegeeks.com/2012/10/mapreduce-working-through-data-2.html

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

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

相關文章

python爬蟲需要什么知識-學習Python爬蟲技術,需要掌握哪些web端的知識?

HTML5&#xff1a;html概述和基本結構、html標題標簽、html段落標簽、換行標簽、塊標簽、圖片標簽、a鏈接標簽、列表標簽、表格、表單、頁面布局等。 CSS3&#xff1a;CSS基本語法和頁面引用、CSS文本設置、顏色表示法、CSS選擇器、盒子模型、盒子模型實際尺寸、浮動、四大定位…

UDP學習總結

1、UDP的優勢是什么&#xff1f;有哪些典型的應用是使用UDP的&#xff1f;為什么&#xff1f; 2、轉載于:https://www.cnblogs.com/zhouhaibing/p/7669251.html

Linux版本的SVN客戶端,linux 下安裝 subversion(svn) 客戶端

svn server 為只支持http://協議的windows;test web server 為as4,現需安裝svn客戶端方便同步代碼網上找了下都是講如何安裝svn server的&#xff0c;我只需要一個支持http協議的客戶端哈&#xff0c;不想裝apache。安裝所需軟件apr,apr-util,sqlite,neon,subversion1.下載軟件…

使用bootstrap的dropdown部件時報錯:error:Bootstrap dropdown require Popper.js

前言&#xff1a;前端小白一枚&#xff0c;剛注冊博客&#xff0c;先發個學習過程中新碰到小問題試試水吧~ 摘要&#xff1a;最近在學習bootstrap&#xff0c;偶然碰到了一個小問題&#xff0c;bootstrap網站也沒有做過多的解釋&#xff0c;今天分享給大家。 問題描述&#x…

C#中的三層

三層架構(3-tier architecture) 通常意義上的三層架構就是將整個業務應用劃分為&#xff1a;界面層&#xff08;User Interface layer&#xff09;、業務邏輯層&#xff08;Business Logic Layer&#xff09;、數據訪問層&#xff08;Data access layer&#xff09;。區分層次的…

研究僵局–第3部分

在本系列的前兩個博客&#xff08; 第1部分和第2部分&#xff09;中 &#xff0c;我演示了如何創建一段死鎖的不良代碼&#xff0c;然后使用該代碼展示了進行線程轉儲的三種方式。 在這個博客中&#xff0c;我將分析線程轉儲以找出錯誤的原因。 下面的討論同時涉及本系列第1部…

qq2009顯ip版怎么用_毛孔粗大怎么破?用對方法,輕松改善顯皮膚嫩滑

臉上毛孔粗大怎么破&#xff1f;超級煩惱尤其是一到秋季臉上經常油膩膩的為什么會毛孔粗大呢&#xff1f;毛孔粗大怎么破&#xff1f;用對方法&#xff0c;輕松改善顯皮膚嫩滑 當皮膚老舊角質積聚越多&#xff0c;會使肌膚變厚、變粗糙&#xff0c;毛孔變粗大&#xff0c;肌膚也…

linux 賬號密碼 字段,詳解Linux中的用戶密碼管理命令passwd和change

passwd修改用戶密碼參數-k 保持未過期身份驗證令牌-l 關閉賬號密碼。效果相當于usermod -L&#xff0c;只有root才有權使用此項。-u 恢復賬號密碼。效果相當于usermod -U&#xff0c;同樣只有root才有權使用。-g 修改組密碼。gpasswd的等效命令。-f 更改由finger命令訪問的用戶…

hello程序的運行過程-從計算機系統角度

hello程序的運行過程-從計算機系統角度 1、gcc編譯器驅動程序讀取源程序文件hello.c&#xff0c;并將它翻譯成一個可執行目標文件hello。翻譯過程分為四個階段&#xff1a;預處理階段&#xff0c;編譯階段&#xff0c;匯編階段&#xff0c;鏈接階段。 2、初始時&#xff0c;she…

靠譜的div引入任何外鏈內容

靠譜的div引入任何外鏈內容 開發中經常要在div中引入一個頁面,該頁面可能是內部頁面,可能是一個外部頁面,也可能只是一個域名獲取的請求. 對于內部頁面的加載,建議使用jquery的load函數,如: 1 $("#targetId").load("someUrl/templatePage.html"); 對于外…

Eclipse對類固醇的重構

在上一篇有關常見Java違規的文章中 &#xff0c;我列出了Java開發人員容易犯的一系列錯誤。 在重構Java項目以解決這些違規問題的同時&#xff0c;我廣泛使用了Eclipse的重構功能來快速更改代碼。 下面是這種重構技術的匯編。 1.在塊級語句周圍添加花括號 用{curly braces}包裝…

微服務發展的歷史_“美麗新羌 光照未來” 新羌社區開展微視頻宣傳片拍攝活動...

見圳客戶端、深圳新聞網訊(記者 王志明 通訊員 甘力宇)為記錄新羌社區的歷史變遷&#xff0c;弘揚新羌人與時俱進、開拓進取的創新精神&#xff0c;宣傳社區黨委、社區一線工作者及社區居民的感人事跡和精神&#xff0c;展現深圳社區發展新風貌&#xff0c;2020年10月&#xff…

linux中掃描儀驅動程序,VueScan For Linux通用掃描儀驅動下載_VueScan For Linux通用掃描儀驅動官方下載-太平洋下載中心...

VueScan For Linux通用掃描儀驅動是一款提供 Linux 使用的圖片掃描工具&#xff0c;它具有各種高級硬件能力使用非常廣泛的的掃描儀軟件&#xff0c;支持EPSon、HP、Nikon 和Canon 品牌的掃描儀設備&#xff0c;具有優良的色彩保真度和色彩平衡&#xff0c;可以讓用戶比平板掃描…

HTML head 頭部中的各類標簽

HTML <head> 頭部 <head> 元素包含了所有的頭部標簽元素。在 <head>元素中你可以插入腳本&#xff08;scripts&#xff09;, 樣式文件&#xff08;CSS&#xff09;&#xff0c;及各種meta信息。 可以添加在頭部區域的元素標簽為: <title>, <style&g…

CSS變量(自定義屬性)實踐指南

本文翻譯自&#xff1a;https://www.sitepoint.com/practical-guide-css-variables-custom-properties/ 轉載請注明出處&#xff1a;葡萄城官網&#xff0c;葡萄城為開發者提供專業的開發工具、解決方案和服務&#xff0c;賦能開發者。 Sass和Less這樣的預處理器&#xff0c;讓…

避免使用FOR –反假戰役

您是否想知道FOR如何影響您的代碼&#xff1f; 他們如何限制您的設計&#xff0c;更重要的是如何將您的代碼轉換為無人為含義的多行代碼&#xff1f; 在這篇文章中&#xff0c;我們將看到如何將for的簡單示例&#xff08;由Francesco Cirillio提供- 反if活動&#xff09;轉換為…

ffmpeg-win32-v3.2.4 下載_MVBOX下載|MVBOX 7.1.0.4官方版

還是要強調一句&#xff0c;現在市面上很多盜版或者免費的軟件&#xff0c;都給一些黑客留下了暗門&#xff0c;所以大家還是支持正版比較好&#xff0c;不要貪圖便宜使用盜版軟件造成不好的后果。MVBOX播放器功能介紹1、在線卡拉OK2、虛擬攝像頭3、畫面調色板4、攝像頭摳像5、…

linux重啟鼠標鍵盤服務,Linux 關閉服務后 鼠標 鍵盤用不了

大部分情況下我們做實驗都是使用虛擬機&#xff0c;但是個人比較本實在太老了&#xff0c;性能有限&#xff0c;所以虛擬機里面的系統啟動神慢&#xff0c;怎么辦&#xff1f;把系統中自己用不到的服務全部關閉掉唄&#xff0c;如下for i in chkconfig --list | awk {print $1}…

拖拽功能-jquery

<!DOCTYPE html><html lang"en"><head> <meta charset"UTF-8"> <title>拖拽</title> <style> .nav { width: 200px; height: 200px; border: 1px solid blac…

PNG,GIF,JPG的區別及如何選

GIF&#xff1a; 1&#xff1a;256色 2&#xff1a; 無損&#xff0c;編輯 保存時候&#xff0c;不會損失。 3&#xff1a;支持簡單動畫。 4&#xff1a;支持boolean透明&#xff0c;也就是要么完全透明&#xff0c;要么不透明 JPEG&#xff1a; 1&#xff1a;millions o…