MapReduce詳解

MapReduce簡介

MapReduce是一種編程模型,用于大規模數據集(大于1TB)的并行運算。概念"Map(映射)"和"Reduce(歸約)",是它們的主要思想。

MapReduce極大地方便了編程人員在不會分布式并行編程的情況下,將自己的程序運行在分布式系統上。


WordCount單詞計數

單詞計數是最簡單也是最能體現MapReduce思想的程序之一,可以稱為MapReduce版"Hello World"。
詞計數主要完成功能是:統計一系列文本文件中每個單詞出現的次數。

以下是WordCount過程圖解,可以先大致瀏覽下,然后結合下文的Mapper和Reduce任務詳解進行理解。

分片后解析為鍵值對

map
分區排序合并
reduce


分析MapReduce執行過程

MapReduce運行的時候,會通過Mapper運行的任務讀取HDFS中的數據文件,然后調用自己的方法,處理數據,最后輸出。Reducer任務會接收Mapper任務輸出的數據,作為自己的輸入數據,調用自己的方法,最后輸出到HDFS的文件中。整個流程如圖:

1.png


Mapper任務詳解

每個Mapper任務是一個java進程,它會讀取HDFS中的文件,解析成很多的鍵值對,經過我們覆蓋的map方法處理后,轉換為很多的鍵值對再輸出。整個Mapper任務的處理過程又可以分為以下幾個階段,如圖所示。

2.png

在上圖中,把Mapper任務的運行過程分為六個階段。

  • 第一階段是把輸入文件按照一定的標準進行分片(InputSplit),每個輸入片的大小是固定的。默認情況下,輸入片(InputSplit)的大小與數據塊(Block)的大小是相同的。如果數據塊(Block)的大小是默認值64MB,輸入文件有兩個,一個是32MB,一個是72MB。那么小的文件是一個輸入片,大文件會分為兩個數據塊,那么是兩個輸入片。一共產生三個輸入片。每一個輸入片由一個Mapper進程處理。這里的三個輸入片,會有三個Mapper進程處理。

  • 第二階段是對輸入片中的記錄按照一定的規則解析成鍵值對。有個默認規則是把每一行文本內容解析成鍵值對。“鍵”是每一行的起始位置(單位是字節),“值”是本行的文本內容。

  • 第三階段是調用Mapper類中的map方法。第二階段中解析出來的每一個鍵值對,調用一次map方法。如果有1000個鍵值對,就會調用1000次map方法。每一次調用map方法會輸出零個或者多個鍵值對。

  • 第四階段是按照一定的規則對第三階段輸出的鍵值對進行分區。比較是基于鍵進行的。比如我們的鍵表示省份(如北京、上海、山東等),那么就可以按照不同省份進行分區,同一個省份的鍵值對劃分到一個區中。默認是只有一個區。分區的數量就是Reducer任務運行的數量。默認只有一個Reducer任務。

  • 第五階段是對每個分區中的鍵值對進行排序。首先,按照鍵進行排序,對于鍵相同的鍵值對,按照值進行排序。比如三個鍵值對<2,2>、<1,3>、<2,1>,鍵和值分別是整數。那么排序后的結果是<1,3>、<2,1>、<2,2>。如果有第六階段,那么進入第六階段;如果沒有,直接輸出到本地的linux文件中。

  • 第六階段是對數據進行歸約處理,也就是reduce處理。鍵相等的鍵值對會調用一次reduce方法。經過這一階段,數據量會減少。歸約后的數據輸出到本地的linxu文件中。本階段默認是沒有的,需要用戶自己增加這一階段的代碼。


Reducer任務詳解

每個Reducer任務是一個java進程。Reducer任務接收Mapper任務的輸出,歸約處理后寫入到HDFS中,可以分為如下圖所示的幾個階段。

3.png

  • 第一階段是Reducer任務會主動從Mapper任務復制其輸出的鍵值對。Mapper任務可能會有很多,因此Reducer會復制多個Mapper的輸出。

  • 第二階段是把復制到Reducer本地數據,全部進行合并,即把分散的數據合并成一個大的數據。再對合并后的數據排序。

  • 第三階段是對排序后的鍵值對調用reduce方法。鍵相等的鍵值對調用一次reduce方法,每次調用會產生零個或者多個鍵值對。最后把這些輸出的鍵值對寫入到HDFS文件中。


Shuffle--MapReduce心臟

Shuffle過程是MapReduce的核心,也被稱為奇跡發生的地方。

8.jpg

上面這張圖是官方對Shuffle過程的描述,可以肯定的是,單從這張圖基本不可能明白Shuffle的過程,因為它與事實相差挺多,細節也是錯亂的。Shuffle可以大致理解成怎樣把map task的輸出結果有效地傳送到reduce端。也可以這樣理解, Shuffle描述著數據從map task輸出到reduce task輸入的這段過程。

在Hadoop這樣的集群環境中,大部分map task與reduce task的執行是在不同的節點上。很多時候Reduce執行時需要跨節點去拉取其它節點上的map task結果【注意:Map輸出總是寫到本地磁盤,但是Reduce輸出不是,一般是寫到HDFS】

如果集群正在運行的job有很多,那么task的正常執行對集群內部的網絡資源消耗會很嚴重。這種網絡消耗是正常的,我們不能限制,能做的 就是最大化地減少不必要的消耗。還有在節點內,相比于內存,磁盤IO對job完成時間的影響也是可觀的。從最基本的要求來說,我們對Shuffle過程的 期望可以有:

  • 完整地從map task端拉取數據到reduce 端。
  • 在跨節點拉取數據時,盡可能地減少對帶寬的不必要消耗。
  • 減少磁盤IO對task執行的影響。

比如為了減少磁盤IO的消耗,我們可以調節io.sort.mb的屬性。每個Map任務都有一個用來寫入輸出數據的循環內存緩沖區,這個緩沖區默認大小是100M,可以通過io.sort.mb設置,當緩沖區中的數據量達到一個特定的閥值(io.sort.mb * io.sort.spill.percent,其中io.sort.spill.percent 默認是0.80)時,系統將會啟動一個后臺線程把緩沖區中的內容spill 到磁盤。在spill過程中,Map的輸出將會繼續寫入到緩沖區,但如果緩沖區已經滿了,Map就會被阻塞直道spill完成。

spill線程在把緩沖區的數據寫到磁盤前,會對他進行一個二次排序,首先根據數據所屬的partition排序,然后每個partition中再按Key排序。輸出包括一個索引文件和數據文件,如果設定了Combiner,將在排序輸出的基礎上進行。Combiner就是一個Mini Reducer,它在執行Map任務的節點本身運行,先對Map的輸出作一次簡單的Reduce,使得Map的輸出更緊湊,更少的數據會被寫入磁盤和傳送到Reducer。Spill文件保存在由mapred.local.dir指定的目錄中,Map任務結束后刪除。

Shuffle其他細節這里不再詳述,下面這些文章可能對大家有所幫助:
http://my.oschina.net/u/2003855/blog/310301
http://blog.csdn.net/thomas0yang/article/details/8562910

轉載于:https://www.cnblogs.com/wangxin37/p/6501495.html

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

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

相關文章

JavaScriptBreak 語句 continue 語句

break 語句用于跳出循環。 continue 用于跳過循環中的一個迭代。 Break 語句 我們已經在本教程之前的章節中見到過 break 語句。它用于跳出 switch() 語句。 break 語句可用于跳出循環。 continue 語句跳出循環后&#xff0c;會繼續執行該循環之后的代碼&#xff08;如果有的話…

kernel mtd 分區與UBOOT 分區的理解

今天做內核移植&#xff0c;準備添加NAND flash的驅動&#xff0c;做到MTD分區時&#xff0c;想起在一本書上看到的一句話&#xff0c;說的是分區時每個區之間沒有間隙&#xff0c;前一個區的結束地址是后一個區的起始地址。可是當我看我的開發板的教程時&#xff0c;分區如下&…

運放的主要參數詳細介紹

1. 引言 運放的作用是調節和放大模擬信號&#xff0c;它是用途十分廣泛的器件&#xff0c;接入適當的反饋網絡&#xff0c;可用作精密的交流和直流放大器、有源濾波器濾波器、振蕩器振蕩器及電壓比較器。其應用領域包括但不限制通訊、電子、汽車、工業檢測等等&#xff0c;并將…

FastDFS 文件上傳工具類

FastDFS文件上傳工具類 import org.csource.common.NameValuePair;import org.csource.fastdfs.ClientGlobal;import org.csource.fastdfs.StorageClient1;import org.csource.fastdfs.StorageServer;import org.csource.fastdfs.TrackerClient;import org.csource.fastdfs.Tra…

MOS管的主要參數與重要特性

雙極性晶體管&#xff1a;NPN和PNP管&#xff1b; 單極性晶體管&#xff1a;場效應管&#xff08;MOSFET和JFET&#xff09;&#xff1b; MOS管相對三極管具有速度快、輸入阻抗高、噪聲低、動態范圍大、功耗小、容易集成等優點。 下面總結下其主要參數與重要特性&#xff0c…

【Codeforces Round #430 (Div. 2) B】Gleb And Pizza

【鏈接】點擊打開鏈接 【題意】 在這里寫題意【題解】 根據圓心到原點的距離這個東西判斷一下圓在不在那個環里面就好【錯的次數】 0【反思】 在這了寫反思【代碼】 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #…

垂直居中方法總結

<style>#box{position: absolute;margin: auto;top:0px;right: 0px;bottom: 0px;left: 0px;width: 100%;height: 30%;background-color: red;text-align: center;} </style> <body><div id"box"><h1>文字居中</h1></div> …

NAND 壞塊管理

NAND的操作管理方式 NAND FLASH的管理方式&#xff1a;以三星FLASH為例&#xff0c;一片Nand flash為一個設備(device)&#xff0c;1 (Device) xxxx (Blocks)&#xff0c;1 (Block) xxxx (Pages)&#xff0c;1(Page) 528 (Bytes) 數據塊大小(512Bytes) OOB 塊大小(16Bytes&…

js備忘錄模式——實現分頁點擊已經請求過上一頁的數據(讀js設計模式)

例子&#xff1a;新聞數據實現分頁||點擊下一頁后又點擊上一頁后不用再次請求數據&#xff0c;避免資源浪費&#xff0c;網速不好&#xff0c;用戶體驗效果差 備忘錄模式&#xff1a;在不破壞對象的封裝性的前提下&#xff0c;在對象之外捕獲并保存該對象內部的狀態以方便日后對…

運放的典型電路舉例與計算仿真

運放電路的計算&#xff0c;通過記各種公式很難記住&#xff0c;但是掌握其兩個重要概念&#xff0c;所有計算均可迎刃而解。 那就是運放的兩個重要特性&#xff1a; 虛斷&#xff1a;運放本質特性&#xff0c;輸入阻抗大&#xff0c;兩個輸入端視為等效開路&#xff1b; 虛…

【SPOJ 694】Distinct Substrings (更直接的求法)

【鏈接】h在這里寫鏈接 【題意】 接上一篇文章【題解】 一個字符串所有不同的子串的個數∑(len-sa[i]-height[i])【錯的次數】 0【反思】 在這了寫反思【代碼】 #include<bits/stdc.h> using namespace std;const int N 2e3; const int MAX_CHAR 300;//每個數字的最大…

HTML-錨點

<!DOCTYPE html> <html> <head lang"en"> <meta charset"UTF-8"> <title>錨點</title> <style> .box1,.box2{ height: 600px; border:1px solid; } </style> </head> <body> <a h…

/dev/mtdN和/dev/mtdblockN的區別

1、/dev/mtdn是linux中的MTD架構中&#xff0c;系統自己實現的mtd分區所對應的字符設備&#xff0c;其里面添加了一些ioctl&#xff0c;支持很多命令&#xff0c;如MEMGETINFO&#xff0c;MEMERASE等。 而mtd-util中的flash_eraseall等工具&#xff0c;就是以這些ioctl為基礎而…

#define GPBCON (*(volatile unsigned *)0x56000010) 的理解

2019獨角獸企業重金招聘Python工程師標準>>> 對于不同的計算機體系結構&#xff0c;設備可能是端口映射&#xff0c;也可能是內存映射的。如果系統結構支持獨立的IO地址空間&#xff0c;并且是端口映射&#xff0c;就必須使用匯編語言完成實際對設備的控制&#xff…

三極管基本參數介紹與放大電路分析

全稱為半導體三極管&#xff0c;也稱雙極型晶體管、晶體三極管&#xff0c;是一種電流控制電流的半導器件&#xff0c;作用是把微弱信號放大成幅度值較大的電信號&#xff0c; 也用作無觸點開關。 兩個PN結的排列方式有兩種&#xff1a;PNP和NPN。 三個端點依序稱為射極&#…

Nand分區及nand erase簡解

我的nand flash 32M&#xff0c;kernel 2.6.18, rootfs is emb linux, cramfs.nand flash分區如下&#xff1a;static struct mtd_partition nand_partitions[] {/* bootloader (UBL, U-Boot, BBT) in sectors: 0 - 14 */{.name "bootloader",.offset 0,.size 32…

eclipse啟動了tomcat,但是瀏覽器打不開歡迎頁

tomcat在eclipse中啟動成功&#xff0c;主頁卻打不開 癥狀&#xff1a; tomcat在eclipse里面能正常啟動&#xff0c;而在瀏覽器中訪問http://localhost:8080/不能訪問&#xff0c;且報404錯誤。同時其他項目頁面也不能訪問。 關閉eclipse里面的tomcat&#xff0c;在tomcat安裝目…

洛谷1011 車站

水題。題目描述有坑&#xff0c;可以先根據樣例手算試一試//Serene #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; const int maxn50; int f[50],…

三極管放大電路三種類型

根據三極管三個電極與輸入輸出端子的連接方式&#xff0c;可歸納為三種&#xff1a;共發射極電路、共基極電路和共集電極電路&#xff1b; 三種電路的共同點&#xff1a;各有兩個回路&#xff0c;一個輸入回路一個輸出回路&#xff0c;兩個回路有一個公共 端&#xff0c;而公…

ImportError: No module named 'chardet'

1.使用requsets出現這個錯誤&#xff0c;ImportError: No module named chardet 原因&#xff1a;requests依賴其他一些模塊 解決&#xff1a;依次使用pip安裝即可 pip install certifi pip install chardet pip install idna pip install urllib3轉載于:https://www.cnblogs.c…