MapReduce詳解和WordCount模擬

最早接觸大數據,常縈繞耳邊的一個詞「MapReduce」。它到底是什么,能做什么,原理又是什么?且聽下文講解。

是什么

MapReduce 即是一個編程模型,又是一個計算框架,它充分采用了分治的思想,將數據處理過程拆分成兩步:Map 和 Reduce。用戶只需要編寫 map() 和 reduce() 函數,就能使問題的計算實現分布式,并在Hadoop上執行。

數據處理

MapReduce 操作數據的最小單位是一個鍵值對。map 端的主要輸入是一對<key,value>值,經過 map 計算后輸出一對<key,value>,然后將相同的 key 合并,形成<key,value 集合>,再將這個<key,value 集合>輸入 reduce ,經過計算輸出零個或多個<key,value>對。

兩個重要的進程

JobTracker

JobTracker 在集群中負責任務調度集群資源監控這兩個功能。TaskTracker 通過周期性的心跳向 JobTracker 匯報當前的健康狀況和狀態,心跳中包括自身計算資源的信息、被占用的計算資源的信息和正在運行中的任務的狀態信息。JobTracker 會根據各個 TaskTracker 周期性發送過來的心跳信息綜合考慮TaskTracker 的資源余量、作業優先級、作業提交時間等因素,為 TaskTracker 分配合適的任務。

JobTracker 提供了一個基于 web 的管理界面,可以通過 JobTracker:50030 端口訪問。

TaskTracker

TaskTracker 主要負責匯報心跳執行 JobTracker 命令這兩個功能。命令主要包括5種:啟動命令、提交命令、殺死任務、殺死作業和重新初始化。

幾個概念

作業(Job) 和 任務(Task)

MapReduce 作業是用戶提交的最小單位,任務是 MapReduce 計算的最小單位。 簡單講,用戶提交的是一個MapReduce作業,一個 MapReduce 作業可以被拆分成兩種——Map 任務和 Reduce 任務。

槽(slot)

槽是Hadoop計算資源的表示模型,Hadoop 將各個節點上的多維度資源(CPU、內存等)抽象成一維度的槽。一個TaskTracker 能夠啟動的任務數量是由 TaskTracker 配置的任務槽決定的。

MapReduce 過程

一個MapReduce作業通常經過 input、map、combine、reduce、output 五個階段。combine 階段不一定發生,map輸出的中間結果分發到 reduce 的過程被稱為 shuffle。shuffle 階段還會發生 copy 和 sort。
MapReduce過程

兩幅重要的流程圖

  • map任務流程圖
    在這里插入圖片描述
  • reduce 任務流程圖
    在這里插入圖片描述

幾個重要的階段說明

map 函數處理后的中間結果會寫到本地磁盤上,在刷寫磁盤的過程中,還做了 partition 和 sort 操作。

map 函數輸出時,并不是簡單地刷寫磁盤,為了保證 I/O 效率,采取了先寫到內存的環形緩沖區,并做一次預排序。請結合map任務流程圖理解。

partition

在分區階段,通過對 key 取模,生成<partition,key,value>三元組,分區階段進行了一次內排序。

MemoryBuffer

內存緩沖區,保存 map 的結果和 partition 處理后的結果,默認大小為100M,溢寫閾值為80M。

spill(溢寫)

內存緩沖區達到閾值時,溢寫線程鎖住這80M的緩沖區,開始將數據寫到本地磁盤中,然后釋放內存。

每次溢寫都會生成一個數據文件,溢出的數據寫到磁盤前會對數據進行 sort 以及合并(combine)。

combine

combine 對map 函數的輸出結果進行早期聚合以減少傳輸的數據量,其作用其實和reduce 函數一樣。combine 的過程發生在 spill(溢寫) 階段。

combine 能夠提升程序性能,但并不是所有常見都適合使用 combine ,例如:求中值。

sort

MapReduce 計算框架主要用到了兩種排序:快速排序和歸并排序。在 Map 任務和 Reduce 任務的過程中,一共發生了三次排序操作:

  • partition 過程中按照鍵值進行的內排序。
  • map 任務完成之前,合并溢寫文件產生輸出文件時進行的一次 sort 操作。
  • shuffle 過程的 sort 操作。

wordcount 實驗模擬

map 端編程代碼(map_a.py):

import sys
import rep =re.compile(r'\w+')
for line in sys.stdin:world_list =line.strip().split()for word in world_list:if len(word)<2:continuew_list =p.findall(word)if len(w_list)>0:w =w_list[0].lower()print "%s\t%d"%(w,1)

reduce 端編程代碼(red_b.py)

import sys
wt =0
cur_word =None
for line in sys.stdin:word,cnt =line.strip().split('\t')if cur_word ==None:cur_word =wordif cur_word !=word:print "%s\t%d"%(cur_word,wt)wt =0cur_word =wordwt =wt+int(cnt)
print "%s\t%d"%(cur_word,wt)

模擬命令

cat The_man_of_property.txt |python ./project/map_a.py | sort -k 1 |python ./project/red_b.py 

輸出顯示

在這里插入圖片描述

轉載于:https://www.cnblogs.com/bbmkey/p/10702196.html

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

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

相關文章

無法創建系統映像_如何創建USB驅動器的映像

無法創建系統映像You can back up your USB drive by creating a saved image. You can then take that saved image and clone multiple USB sticks. This guide shows you how to create an image of your USB drive using Windows 10. 您可以通過創建保存的圖像來備份USB驅動…

UGUI事件之Drag拖拽事件

UI事件之Drag拖拽事件2.UGUI 事件命名空間   當我們需要使用 UGUI 中的事件的時候&#xff0c;需要在腳本內引入專有命名空間&#xff1a;   using UnityEngine.EventSystems;----------------------------------2.拖拽相關事件接口----------------------------------1.三…

java 通過cookie判斷是否登陸

protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// 判斷cookie是否有登錄信息Cookie[] cookies req.getCookies();boolean isLogin false;for(Cookie c : cookies){if("loginInfo".equals(c.getNa…

使用高級管理控制臺獲得對Windows Home Server的擴展訪問

Windows Home Server is easy to setup and use so anyone with basic computer knowledge can operate their own server. But what if you’re an advanced user and want more control over various administrative functions? The Advanced Admin Console Addin gives you…

變動性算法源代碼分析與使用示例(copy_backward、 transform、 replace_copy_if 等)

首先回顧前面的文章&#xff0c;我們把for_each 歸類為非變動性算法&#xff0c;實際上它也可以算是變動性算法&#xff0c;取決于傳入的第三個參數&#xff0c;即函數 指針。如果在函數內對容器元素做了修改&#xff0c;那么就屬于變動性算法。 變動性算法源代碼分析與使用示例…

[轉]QDir類及其用法總結

直接給出原文鏈接&#xff1a;QDir類及其用法總結 轉載于:https://www.cnblogs.com/rainbow70626/p/10330643.html

如何在Outlook中的電子郵件上顯示快速操作按鈕

There are probably actions you regularly perform in Outlook, such as deleting, archiving, and marking things as read. Here’s how to use Quick Action buttons to add one-click options that appear over every email to perform each action. 您可能會在Outlook中定…

c++讀取和寫入TXT文件的整理

c讀取和寫入TXT文件的整理 #include "stdafx.h" #include <iostream> //無論讀寫都要包含<fstream>頭文件 #include <fstream> #include <iomanip> using namespace std;int main() {//ifstream從文件流向內存的ifstream表示文件輸入流…

使用RestTemplate時報錯java.lang.IllegalStateException: No instances available for 127.0.0.1

我在RestTemplate的配置類里使用了 LoadBalancedComponentpublic class RestTemplateConfig { Bean LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }}或者 再調用Autowiredprivate RestTemplate restTemplate;必須使用應用名作為代替ip:端口&a…

sh變量特性(3)默認特性

變量說明$0當前腳本的文件名$n傳遞給腳本或函數的參數&#xff0c;n是數字&#xff0c;第n個參數$#傳遞給腳本或函數的參數個數$*傳遞給腳本或函數的所有參數$傳遞給腳本或函數的所有參數。被””包含時&#xff0c;與$*稍有不同$?上個命令的退出狀態&#xff0c;或函數返回值…

zune linux_更新您的Zune Player軟件

zune linuxKeeping your computer and software up to date is very important in keeping everything running smooth and secure. It’s also important to keep your geeky gadgets updated as well. Here we take a look at updating a Zune HD. 保持計算機和軟件的最新狀態…

繼承的幾種方式

1.借助構造函數實現繼承 function Parent() { this.name parent } Parent.prototype.say function () { // 不能被繼承 this.say function() { console.log(hello this.name) } } function Child() { Parent.call(this) this.type child } console.log(new Child) // 沒有參…

寫一個簡單的 django_post demo

1.新建一個django工程&#xff0c;其路由為下圖 2.要做的是一個 簡單的登錄請求&#xff0c;以表單形式提交&#xff0c;html 部分代碼如下 這里注意action指向的是路由的地址&#xff0c;index1后的views.login部分代碼如下 這段代碼指的是&#xff0c;如果login接收到的請求是…

日志收集

2019獨角獸企業重金招聘Python工程師標準>>> ELK (ElasticSearch、Logstash、Kibana)&#xff1a; https://my.oschina.net/itblog/blog/547250 轉載于:https://my.oschina.net/zfscofield/blog/1625703

autocopy2u_借助AutoCopy簡化Firefox中的文本復制和粘貼

autocopy2uLooking for an easy way to speed up copying and pasting in Firefox? Now you can reduce the amount of work that you have to do by half with AutoCopy. 是否在尋找一種簡便的方法來加快Firefox中的復制和粘貼&#xff1f; 現在&#xff0c;您可以使用自動復…

virtualenv模塊使用

開發多個應用&#xff1a; 如A需要jinja2.7開發&#xff1b;如B需要jinja2.6開發。或者C需要Python2.7開發&#xff0c;D需要Python3.5開發 那么解決上述問題就需要使用virtualenv這個模塊&#xff1a; 它的作用是&#xff1a;創建“隔離”環境&#xff0c;使項目擁有獨立的Pyt…

僵尸進程處理方式

Linux服務器上&#xff0c;多少會出現一些僵尸進程&#xff0c;下面介紹如何快速尋找和消滅這些僵尸進程的方法 首先&#xff0c;我們可以用top命令來查看服務器當前是否有僵尸進程&#xff0c;在下圖中可以看到僵尸進程數的提示&#xff0c;如果數字大于0&#xff0c;那么意味…

chromebook刷機_如何查看Chromebook的停產日期

chromebook刷機Google谷歌There comes a time in your Chromebook’s life when it no longer receives updates from Google. It’s inevitable and could be a lot sooner than you think. Here’s how to see your Chromebook’s scheduled end-of-life date. Chromebook一生…

C#將unix時間戳轉換成.net的DateTime類型的代碼

下面的內容是關于C#將unix時間戳轉換成.net的DateTime類型的內容。 DateTime epoch new DateTime(1970,1,1,0,0,0,0, DateTimeKind.Utc);DateTime myDate epoch.AddSeconds(1258598728).toLocalTime(); 轉載于:https://www.cnblogs.com/odsxe/p/10338494.html

【活動】AI人工智能技術沙龍 |杭州站

AI人工智能技術沙龍 |杭州站將于2018年3月3號在浙江杭州市文一西路1818-2號中國&#xff08;杭州&#xff09;人工智能小鎮舉辦由袋鼠云、七牛云及“因特鏈”社區的老師為大家帶來AI純技術干貨分享另有區塊鏈和AI人工智能技術融合技術主題1活動安排時間&#xff1a;2018年3月3號…