MAPREDUCE原理篇(1)

MAPREDUCE概念

Mapreduce是一個(gè)分布式運(yùn)算程序的編程框架劝堪,是用戶開發(fā)“基于hadoop的數(shù)據(jù)分析應(yīng)用”的核心框架;
Mapreduce核心功能是將用戶編寫的業(yè)務(wù)邏輯代碼和自帶默認(rèn)組件整合成一個(gè)完整的分布式運(yùn)算程序揉稚,并發(fā)運(yùn)行在一個(gè)hadoop集群上

為什么要MAPREDUCE

  1. 海量數(shù)據(jù)在單機(jī)上處理因?yàn)橛布Y源限制秒啦,無(wú)法勝任
  2. 而一旦將單機(jī)版程序擴(kuò)展到集群來(lái)分布式運(yùn)行,將極大增加程序的復(fù)雜度和開發(fā)難度
  3. 引入mapreduce框架后搀玖,開發(fā)人員可以將絕大部分工作集中在業(yè)務(wù)邏輯的開發(fā)上余境,而將分布式計(jì)算中的復(fù)雜性交由框架來(lái)處理

設(shè)想一個(gè)海量數(shù)據(jù)場(chǎng)景下的wordcount需求:

單機(jī)版:內(nèi)存受限,磁盤受限灌诅,運(yùn)算能力受限
分布式:
文件分布式存儲(chǔ)(HDFS)
運(yùn)算邏輯需要至少分成2個(gè)階段(一個(gè)階段獨(dú)立并發(fā)芳来,一個(gè)階段匯聚)
運(yùn)算程序如何分發(fā)
程序如何分配運(yùn)算任務(wù)(切片)
兩階段的程序如何啟動(dòng)?如何協(xié)調(diào)猜拾?
整個(gè)程序運(yùn)行過程中的監(jiān)控即舌?容錯(cuò)?重試挎袜?

可見在程序由單機(jī)版擴(kuò)成分布式時(shí)晾浴,會(huì)引入大量的復(fù)雜工作。為了提高開發(fā)效率叶撒,可以將分布式程序中的公共功能封裝成框架,讓開發(fā)人員可以將精力集中于業(yè)務(wù)邏輯务豺。

而mapreduce就是這樣一個(gè)分布式程序的通用運(yùn)算框架

MAPREDUCE框架結(jié)構(gòu)及核心運(yùn)行機(jī)制

結(jié)構(gòu)

一個(gè)完整的mapreduce程序在分布式運(yùn)行時(shí)有三類實(shí)例進(jìn)程:

  1. MRAppMaster:負(fù)責(zé)整個(gè)程序的過程調(diào)度及狀態(tài)協(xié)調(diào)
  2. mapTask:負(fù)責(zé)map階段的整個(gè)數(shù)據(jù)處理流程
  3. ReduceTask:負(fù)責(zé)reduce階段的整個(gè)數(shù)據(jù)處理流程

MR程序運(yùn)行流程

流程解析

  1. 一個(gè)mr程序啟動(dòng)的時(shí)候,最先啟動(dòng)的是MRAppMaster嗦明,MRAppMaster啟動(dòng)后根據(jù)本次job的描述信息笼沥,計(jì)算出需要的maptask實(shí)例數(shù)量,然后向集群申請(qǐng)機(jī)器啟動(dòng)相應(yīng)數(shù)量的maptask進(jìn)程

  2. maptask進(jìn)程啟動(dòng)之后娶牌,根據(jù)給定的數(shù)據(jù)切片范圍進(jìn)行數(shù)據(jù)處理奔浅,主體流程為:
    a) 利用客戶指定的inputformat來(lái)獲取RecordReader讀取數(shù)據(jù),形成輸入KV對(duì)
    b) 將輸入KV對(duì)傳遞給客戶定義的map()方法诗良,做邏輯運(yùn)算汹桦,并將map()方法輸出的KV對(duì)收集到緩存
    c) 將緩存中的KV對(duì)按照K分區(qū)排序后不斷溢寫到磁盤文件

  3. MRAppMaster監(jiān)控到所有maptask進(jìn)程任務(wù)完成之后,會(huì)根據(jù)客戶指定的參數(shù)啟動(dòng)相應(yīng)數(shù)量的reducetask進(jìn)程鉴裹,并告知reducetask進(jìn)程要處理的數(shù)據(jù)范圍(數(shù)據(jù)分區(qū))

  4. Reducetask進(jìn)程啟動(dòng)之后舞骆,根據(jù)MRAppMaster告知的待處理數(shù)據(jù)所在位置,從若干臺(tái)maptask運(yùn)行所在機(jī)器上獲取到若干個(gè)maptask輸出結(jié)果文件径荔,并在本地進(jìn)行重新歸并排序督禽,然后按照相同key的KV為一個(gè)組,調(diào)用客戶定義的reduce()方法進(jìn)行邏輯運(yùn)算总处,并收集運(yùn)算輸出的結(jié)果KV狈惫,然后調(diào)用客戶指定的outputformat將結(jié)果數(shù)據(jù)輸出到外部存儲(chǔ)

MapTask并行度決定機(jī)制

maptask的并行度決定map階段的任務(wù)處理并發(fā)度,進(jìn)而影響到整個(gè)job的處理速度
那么鹦马,mapTask并行實(shí)例是否越多越好呢胧谈?其并行度又是如何決定呢?

mapTask并行度的決定機(jī)制

一個(gè)job的map階段并行度由客戶端在提交job時(shí)決定
而客戶端對(duì)map階段并行度的規(guī)劃的基本邏輯為:
將待處理數(shù)據(jù)執(zhí)行邏輯切片(即按照一個(gè)特定切片大小荸频,將待處理數(shù)據(jù)劃分成邏輯上的多個(gè)split)菱肖,然后每一個(gè)split分配一個(gè)mapTask并行實(shí)例處理

這段邏輯及形成的切片規(guī)劃描述文件,由InputFormat實(shí)現(xiàn)類的getSplits()方法完成旭从,其過程如下圖:

FileInputFormat切片機(jī)制

1稳强、切片定義在InputFormat類中的getSplit()方法

2、FileInputFormat中默認(rèn)的切片機(jī)制:

a) 簡(jiǎn)單地按照文件的內(nèi)容長(zhǎng)度進(jìn)行切片
b) 切片大小遇绞,默認(rèn)等于block大小
c) 切片時(shí)不考慮數(shù)據(jù)集整體键袱,而是逐個(gè)針對(duì)每一個(gè)文件單獨(dú)切片
比如待處理數(shù)據(jù)有兩個(gè)文件
file1.txt 320M
file2.txt 10M
經(jīng)過FileInputFormat的切片機(jī)制運(yùn)算后燎窘,形成的切片信息如下:
file1.txt.split1-- 0~128
file1.txt.split2-- 128~256
file1.txt.split3-- 256~320
file2.txt.split1-- 0~10M

3摹闽、FileInputFormat中切片的大小的參數(shù)配置

通過分析源碼,在FileInputFormat中褐健,計(jì)算切片大小的邏輯:Math.max(minSize, Math.min(maxSize, blockSize)); 切片主要由這幾個(gè)值來(lái)運(yùn)算決定

minsize:默認(rèn)值:1
配置參數(shù): mapreduce.input.fileinputformat.split.minsize
maxsize:默認(rèn)值:Long.MAXValue
配置參數(shù):mapreduce.input.fileinputformat.split.maxsize blocksize

因此付鹿,默認(rèn)情況下澜汤,切片大小=blocksize
maxsize(切片最大值):
參數(shù)如果調(diào)得比blocksize小,則會(huì)讓切片變小舵匾,而且就等于配置的這個(gè)參數(shù)的值
minsize (切片最小值):
參數(shù)調(diào)的比blockSize大俊抵,則可以讓切片變得比blocksize還大

選擇并發(fā)數(shù)的影響因素:
運(yùn)算節(jié)點(diǎn)的硬件配置
運(yùn)算任務(wù)的類型:CPU密集型還是IO密集型
運(yùn)算任務(wù)的數(shù)據(jù)量

map并行度的經(jīng)驗(yàn)之談

如果硬件配置為212core + 64G,恰當(dāng)?shù)膍ap并行度是大約每個(gè)節(jié)點(diǎn)20-100個(gè)map坐梯,最好每個(gè)map的執(zhí)行時(shí)間至少一分鐘徽诲。
如果job的每個(gè)map或者 reduce task的運(yùn)行時(shí)間都只有30-40秒鐘,那么就減少該job的map或者reduce數(shù)吵血,每一個(gè)task(map|reduce)的setup和加入到調(diào)度器中進(jìn)行調(diào)度谎替,這個(gè)中間的過程可能都要花費(fèi)幾秒鐘,所以如果每個(gè)task都非程8ǎ快就跑完了钱贯,就會(huì)在task的開始和結(jié)束的時(shí)候浪費(fèi)太多的時(shí)間。
配置task的
JVM重用*可以改善該問題:
(mapred.job.reuse.jvm.num.tasks侦另,默認(rèn)是1秩命,表示一個(gè)JVM上最多可以順序執(zhí)行的task
數(shù)目(屬于同一個(gè)Job)是1。也就是說一個(gè)task啟一個(gè)JVM)

如果input的文件非常的大褒傅,比如1TB弃锐,可以考慮將hdfs上的每個(gè)block size設(shè)大,比如設(shè)成256MB或者512MB

ReduceTask并行度的決定

reducetask的并行度同樣影響整個(gè)job的執(zhí)行并發(fā)度和執(zhí)行效率樊卓,但與maptask的并發(fā)數(shù)由切片數(shù)決定不同拿愧,Reducetask數(shù)量的決定是可以直接手動(dòng)設(shè)置:

默認(rèn)值是1,手動(dòng)設(shè)置為4 job.setNumReduceTasks(4);

如果數(shù)據(jù)分布不均勻碌尔,就有可能在reduce階段產(chǎn)生數(shù)據(jù)傾斜
注意: reducetask數(shù)量并不是任意設(shè)置浇辜,還要考慮業(yè)務(wù)邏輯需求,有些情況下唾戚,需要計(jì)算全局匯總結(jié)果柳洋,就只能有1個(gè)reducetask

盡量不要運(yùn)行太多的reduce task。對(duì)大多數(shù)job來(lái)說叹坦,最好rduce的個(gè)數(shù)最多和集群中的reduce持平熊镣,或者比集群的 reduce slots小。這個(gè)對(duì)于小集群而言募书,尤其重要绪囱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市莹捡,隨后出現(xiàn)的幾起案子鬼吵,更是在濱河造成了極大的恐慌,老刑警劉巖篮赢,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件齿椅,死亡現(xiàn)場(chǎng)離奇詭異琉挖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)涣脚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門示辈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人遣蚀,你說我怎么就攤上這事矾麻。” “怎么了芭梯?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵射富,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我粥帚,道長(zhǎng)胰耗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任芒涡,我火速辦了婚禮柴灯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘费尽。我一直安慰自己赠群,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布旱幼。 她就那樣靜靜地躺著查描,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柏卤。 梳的紋絲不亂的頭發(fā)上冬三,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音缘缚,去河邊找鬼勾笆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛桥滨,可吹牛的內(nèi)容都是我干的窝爪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼齐媒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蒲每!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起喻括,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤邀杏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后双妨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淮阐,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年刁品,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泣特。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挑随,死狀恐怖状您,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兜挨,我是刑警寧澤膏孟,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站拌汇,受9級(jí)特大地震影響柒桑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜噪舀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一魁淳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧与倡,春花似錦界逛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至净响,卻和暖如春少欺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背馋贤。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工狈茉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掸掸。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓氯庆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親扰付。 傳聞我的和親對(duì)象是個(gè)殘疾皇子堤撵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 摘自:http://staticor.io/post/hadoop/2016-01-23hadoop-defini...
    wangliang938閱讀 583評(píng)論 0 1
  • Spark RDD(Resilient Distributed Datasets)論文 概要 1: 介紹 2: R...
    Joyyx閱讀 1,856評(píng)論 0 5
  • 先思考問題 我們處在一個(gè)大數(shù)據(jù)的時(shí)代已經(jīng)是不爭(zhēng)的事實(shí),這主要表現(xiàn)在數(shù)據(jù)源多且大羽莺,如互聯(lián)網(wǎng)數(shù)據(jù)实昨,人們也認(rèn)識(shí)到數(shù)據(jù)里往...
    墻角兒的花閱讀 7,348評(píng)論 0 9
  • 記得最后一天去上班的時(shí)候,特意化了個(gè)妝盐固,一早上在公司樓下遇見同事荒给,他說"最后一天上班這么漂亮罢尚!"我害羞地說"沒有...
    桃子醬呀閱讀 228評(píng)論 0 0
  • 眾多醫(yī)學(xué)研究及臨床試驗(yàn)證明:人體細(xì)胞電子被搶奪是萬(wàn)病之源志电,自由基ROS是一種缺乏電子的物質(zhì)(不飽和電子物質(zhì))曙咽,進(jìn)入...
    金石明鏡閱讀 512評(píng)論 0 2