目錄
input split
map
shuffle
reduce
架構(gòu)設(shè)計(jì)
一個(gè)單詞統(tǒng)計(jì)的例子引入
input split
在進(jìn)行map計(jì)算之前术陶,mapreduce會(huì)根據(jù)輸入文件計(jì)算輸入分片(input split)梧宫,每個(gè)輸入分片(input split)針對(duì)一個(gè)map任務(wù)塘匣,輸入分片(input split)存儲(chǔ)的并非數(shù)據(jù)本身兆解,而是一個(gè)分片長(zhǎng)度和一個(gè)記錄數(shù)據(jù)的位置的數(shù)組
輸入分片(input split)往往和hdfs的block(塊)關(guān)系很密切锅睛,假如我們?cè)O(shè)定hdfs的塊的大小是64mb历谍,如果我們輸入有三個(gè)文件望侈,大小分別是3mb勋桶、65mb和127mb例驹,那么mapreduce會(huì)把3mb文件分為一個(gè)輸入分片(input split),65mb則是兩個(gè)輸入分片(input split)而127mb也是兩個(gè)輸入分片(input split)鹃锈,
換句話說(shuō)我們?nèi)绻?strong>在map計(jì)算前做輸入分片調(diào)整屎债,例如合并小文件盆驹,那么就不會(huì)有5個(gè)map任務(wù)將執(zhí)行,而且每個(gè)map執(zhí)行的數(shù)據(jù)大小不均辫封,這個(gè)也是mapreduce優(yōu)化計(jì)算的一個(gè)關(guān)鍵點(diǎn)玖瘸。
map
就是編寫好的map函數(shù)雅倒,因此map函數(shù)效率相對(duì)好控制弧可,而且一般map操作都是本地化操作也就是在數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)上進(jìn)行
shuffle
map在做輸出時(shí)候會(huì)在內(nèi)存里開啟一個(gè)環(huán)形內(nèi)存緩沖區(qū)裁良,這個(gè)緩沖區(qū)專門用來(lái)輸出的校套,默認(rèn)100MB笛匙,當(dāng)數(shù)據(jù)達(dá)到一定閾值就會(huì)把內(nèi)容寫到磁盤上犀变,這個(gè)過程叫spill获枝,這個(gè)閾值一般是0.8骇笔,也就是80MB笨触,另外的20%內(nèi)存可以繼續(xù)寫入要寫進(jìn)磁盤的數(shù)據(jù),寫入磁盤和寫入內(nèi)存操作是互不干擾的*谎脯,如果緩存區(qū)被撐滿了持寄,那么map就會(huì)阻塞寫入內(nèi)存的操作,讓寫入磁盤操作完成后再繼續(xù)執(zhí)行寫入內(nèi)存操作废麻。
Partitioner模庐,將map輸出數(shù)據(jù)到本地磁盤過程中進(jìn)行分區(qū)操作掂碱,目的是將reduce對(duì)應(yīng)起來(lái),一個(gè)Partitioner對(duì)應(yīng)一個(gè)reduce作業(yè)沧卢,同時(shí)還對(duì)其進(jìn)行對(duì)key值排序sort但狭。簡(jiǎn)單理解就是按照統(tǒng)計(jì)結(jié)果按照條件輸入到不同文件當(dāng)中(分區(qū))撬即。比如將手機(jī)號(hào)按照 135 137 187開頭的分別放到一個(gè)獨(dú)立的文件當(dāng)中 ,其他的放到一個(gè)文件夾唱歧。
如果我們定義了combiner函數(shù)颅崩,那么排序前還會(huì)執(zhí)行combiner操作。combiner階段是程序員可以選擇的挨摸,combiner其實(shí)也是一種reduce操作得运,因此我們看見WordCount類里是用reduce進(jìn)行加載的熔掺。Combiner主要是在map計(jì)算出中間文件前做一個(gè)簡(jiǎn)單的合并重復(fù)key值的操作。
例如我們對(duì)文件里的單詞頻率做統(tǒng)計(jì)推沸,map計(jì)算時(shí)候如果碰到一個(gè)hadoop的單詞就會(huì)記錄為1鬓催,但是這篇文章里hadoop可能會(huì)出現(xiàn)n多次宇驾,那么map輸出文件冗余就會(huì)很多猴伶,因此在reduce計(jì)算前對(duì)相同的key做一個(gè)合并操作,那么文件會(huì)變小筝尾,這樣就提高了寬帶的傳輸效率筹淫,畢竟hadoop計(jì)算力寬帶資源往往是計(jì)算的瓶頸也是最為寶貴的資源崔挖。
但是combiner操作是有風(fēng)險(xiǎn)的狸相,使用它的原則是combiner的輸入不會(huì)影響到reduce計(jì)算的最終輸入捐川,例如:如果計(jì)算只是求總數(shù)古沥,最大值娇跟,最小值可以使用combiner苞俘,但是做平均值計(jì)算使用combiner的話吃谣,最終的reduce計(jì)算結(jié)果就會(huì)出錯(cuò)做裙。合并merge锚贱,對(duì)于spill產(chǎn)生的許多小文件進(jìn)行分區(qū)排序合并成大文件拧廊,存放在Map Task運(yùn)行的機(jī)器的本地磁盤,臨時(shí)緩存job結(jié)束會(huì)刪除耐量。
拷貝copy廊蜒,將Map Task運(yùn)行的機(jī)器上山叮,copy數(shù)據(jù)到Reduce Task機(jī)器上。
合并merge添履,將從不同Map Task機(jī)器上的copy出來(lái)的數(shù)據(jù)進(jìn)行合并排序屁倔。
分組group,將相同的Key的value放在一起
reduce
和map函數(shù)一樣也是程序員編寫的暮胧,最終結(jié)果是存儲(chǔ)在hdfs上的锐借。
MR1.0 運(yùn)行架構(gòu)
MapReduce1 的工作機(jī)制中,角色主要包括客戶端往衷, Jobtracker钞翔,Tasktracker
Jobtracker 主要是協(xié)調(diào)作業(yè)的運(yùn)行
Tasktracker 是負(fù)責(zé)運(yùn)行作業(yè)劃分之后的任務(wù)
JobTracker
- 核心,主席舍,單點(diǎn)
- 調(diào)度所有作業(yè)
- 監(jiān)控整個(gè)集群的資源負(fù)載
Tasktracker
- 從布轿,自身節(jié)點(diǎn)資源管理
- 和JobTracker 匯報(bào)資源,獲取Task
MR1.0弊端
- JobTracker 負(fù)載過重,存在單點(diǎn)故障
- 不同框架對(duì)資源不能進(jìn)行全局管理
Client
- 以作業(yè)為單位
- 規(guī)劃作業(yè)計(jì)算分布
- 提交作業(yè)資源到HDFS
- 最終提交作業(yè)到JobTracker
MapReduce 過程(了解):
首先是由客戶端向 Jobtracker 請(qǐng)求一個(gè)新的作業(yè)萝毛,Jobtracker 會(huì)檢查作業(yè)的 輸出路徑是否存在笆包。若存在則拋出異常薯演。若不存在的話,Jobtracker 會(huì)向客戶端返回 job 相關(guān)資源的提交路徑以及 jobID衡创。
接下來(lái)就是客戶端會(huì)將 job 所需的資源(jar 文件,配置文件)交到共享文件系統(tǒng)。并告知 Jobtracker 已將 job 復(fù)制到共享文件系統(tǒng)椰苟,準(zhǔn)備執(zhí)行。
Jobtracker 將提交的 Job 放入內(nèi)部的任務(wù)隊(duì)列,由作業(yè)調(diào)度器進(jìn)行調(diào)度赠潦,并進(jìn)行初始化(包括創(chuàng)建一個(gè)表示正在運(yùn)行作業(yè)的容器臭家,用于封裝任務(wù)和記錄信息)
之后 jobtracker 的作業(yè)調(diào)度器從共享文件系統(tǒng)獲取客戶端計(jì)算好的輸入切 片蹄殃,以創(chuàng)建任務(wù)運(yùn)行列表
Tasktracker 通過心跳與 Jobtracker 保持通信,報(bào)告自己的狀態(tài)鸳谜,以及是否準(zhǔn) 備好運(yùn)行一個(gè) task,若準(zhǔn)備好 蝗肪,Jobtracker 則通過一定的調(diào)度算法從 Jobtracker 中獲得一個(gè) task 分配給 Tasktracker。
Tasktracker 在共享文件系統(tǒng)中獲得任務(wù)相關(guān)資源,實(shí)現(xiàn) jar 本地化诱咏,并創(chuàng)建 響應(yīng)的文件夾以及一個(gè) taskrunner 運(yùn)行該任務(wù)。
taskrunnr 會(huì)啟動(dòng)一個(gè)新的 JVM硕并,在新啟動(dòng)的 JVM 中運(yùn)行任務(wù)乙濒。
進(jìn)度與狀態(tài)的更新:有一個(gè)獨(dú)立的線程向 tasktracker 報(bào)告當(dāng)前任務(wù)狀態(tài)傻丝。同時(shí) Tasktracker 每隔 5s 向 Jobtracker 通過心跳發(fā)送狀態(tài)。JobTracker 將這些更新 合并泛释,發(fā)送給客戶端注竿。