MR編程模型主要分為五個(gè)步驟:輸入、映射、分組、規(guī)約、輸出。
成都創(chuàng)新互聯(lián)專注于霞浦企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),成都做商城網(wǎng)站。霞浦網(wǎng)站建設(shè)公司,為霞浦等地區(qū)提供建站服務(wù)。全流程按需設(shè)計(jì)網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
輸入(InputFormat):
主要包含兩個(gè)步驟—數(shù)據(jù)分片、迭代輸入
數(shù)據(jù)分片(getSplits):數(shù)據(jù)分為多少個(gè)splits,就有多少個(gè)map task;
單個(gè)split的大小,由設(shè)置的split.minsize和split.maxsize決定;
公式為 max{minsize, min{maxsize, blocksize}};
hadoop2.7.3之前blocksize默認(rèn)64M,之后默認(rèn)128M。
決定了單個(gè)split大小之后,就是hosts選擇,一個(gè)split可能包含多個(gè)block(將minsize設(shè)置大于128M);
而多個(gè)block可能分布在多個(gè)hosts節(jié)點(diǎn)上(一個(gè)block默認(rèn)3備份,如果4個(gè)block就可能在12個(gè)節(jié)點(diǎn)),getsplits會(huì)選擇包含數(shù)據(jù)最多的一部分hosts。
由此可見,為了讓數(shù)據(jù)本地話更合理,最好是一個(gè)block一個(gè)task,也就是說(shuō)split大小跟block大小一致。
getSplits會(huì)產(chǎn)生兩個(gè)文件
job.split:存儲(chǔ)的主要是每個(gè)分片對(duì)應(yīng)的HDFS文件路徑,和其在HDFS文件中的起始位置、長(zhǎng)度等信息(map task使用,獲取分片的具體位置);
job.splitmetainfo:存儲(chǔ)的則是每個(gè)分片在分片數(shù)據(jù)文件job.split中的起始位置、分片大小和hosts等信息(主要是作業(yè)初始化時(shí)使用,用于map task的本地化)。
迭代輸入:迭代輸入一條條的數(shù)據(jù),對(duì)于文本數(shù)據(jù)來(lái)說(shuō),key就是行號(hào)、value當(dāng)前行文本。
map task總共可以五個(gè)過(guò)程:read、map、collect、splill、conbine。
Read:從數(shù)據(jù)源讀入一條條數(shù)據(jù);
map:將數(shù)據(jù)傳給map函數(shù),變成另外一對(duì)KV
collect階段:
主要是map處理完的數(shù)據(jù),先放入內(nèi)存的環(huán)形緩沖區(qū)中,待環(huán)形緩沖區(qū)的值超過(guò)一定比例的時(shí)候再執(zhí)行下一步的spill到磁盤;
collect()內(nèi)部會(huì)調(diào)用getPartition來(lái)進(jìn)行分區(qū),而環(huán)形緩沖區(qū)則存儲(chǔ)的是K、V和partition號(hào)
這里采用的兩級(jí)索引結(jié)構(gòu),主要是排序時(shí)在同一個(gè)partition內(nèi)排序,所以先排partition,再排partition內(nèi)部數(shù)據(jù)。
kvindices中記錄的分區(qū)號(hào)、key開始的位置、value開始的位置,也就是一對(duì)兒KV在kvindices中占用3個(gè)int,kvoffsets只記錄一對(duì)KV在kvindices中的偏移地址,所以只需要一個(gè)int,所以二者按1:3的大小分配內(nèi)存。
spill過(guò)程:
環(huán)形緩存區(qū)中內(nèi)存數(shù)據(jù)在超過(guò)一定閾值后會(huì)spill到磁盤上,在splill到磁盤上之前會(huì)先在內(nèi)存中進(jìn)行排序(快速排序);
之后按分區(qū)編號(hào)分別寫到臨時(shí)文件,同一個(gè)分區(qū)編號(hào)后面會(huì)有個(gè)數(shù)字,表示第幾次溢寫,conbine:對(duì)多個(gè)文件合并,多倫遞歸,沒輪合并最小的n個(gè)文件。
reduce總共可分為以下幾個(gè)階段:shuffle、merge、sort、reduce、write
shuffle:從JobTracker中獲取已完成的map task列表以及輸出位置,通過(guò)http接口獲取數(shù)據(jù);
merge:shuffle拉去的數(shù)據(jù)線放入內(nèi)存,內(nèi)存不夠再放入磁盤,會(huì)有一個(gè)線程不斷地合并內(nèi)存和磁盤中的數(shù)據(jù)
sort:reduce從不同的map task中拉取到多個(gè)有序文件,然后再做一次歸并排序,則每個(gè)reduce獲取到文件就都是有序的了