MapReduce 知識(shí)

參與mapreduce作業(yè)執(zhí)行涉及4個(gè)獨(dú)立的實(shí)體:

客戶端(client)
提交MapReduce作業(yè)
JobTracker
1.作業(yè)調(diào)度:將一個(gè)作業(yè)(Job)分成若干個(gè)子任務(wù)分發(fā)到taskTraker中去執(zhí)行
2.任務(wù)監(jiān)控:TaskTracker發(fā)送心跳給JobTracker報(bào)告自己的運(yùn)行狀態(tài)椿猎,以讓JobTracker能夠監(jiān)控到他
3.資源管理:每個(gè)任務(wù)向JobTracker申請資源
4.監(jiān)控過程中發(fā)現(xiàn)失敗或者運(yùn)行過慢的任務(wù)奠蹬,對他進(jìn)行重新啟動(dòng)
TaskTracker
主動(dòng)發(fā)送心跳給jobTracker并與JobTracker通信,從而接受到JobTracker發(fā)送過來需要執(zhí)行的任務(wù)

MapReduce的資源組成由兩部分組成

資源表示模型
用于描述資源表示形式蜕着,Hadoop1.0使用“槽位(slot)”組織各個(gè)節(jié)點(diǎn)的資源,為了簡化資源的管理仿耽,Hadoop將各個(gè)節(jié)點(diǎn)上資源(CPU娄蔼、內(nèi)存、網(wǎng)絡(luò)IO如孝、磁盤IO等等)等量切分成若干份,每一份用“slot”表示娩贷,同時(shí)規(guī)定一個(gè)task可根據(jù)實(shí)際情況需要占用多個(gè)”slot”第晰。
簡單的說:hadoop1.0將多維度的資源進(jìn)行了抽象,使用“slot”來表示彬祖,從而簡化對資源的管理茁瘦。

資源分配模型
而資源分配模型則決定如何將資源分配給各個(gè)作業(yè)/任務(wù),在Hadoop中储笑,這一部分由一個(gè)插拔式的調(diào)度器完成甜熔。

更進(jìn)一步說,slot相當(dāng)于運(yùn)行的“許可證”突倍,一個(gè)任務(wù)只有獲得“許可證”后腔稀,才能夠獲得運(yùn)行的機(jī)會(huì)盆昙,這也意味著,每一個(gè)節(jié)點(diǎn)上的slot的數(shù)量決定了當(dāng)前節(jié)點(diǎn)能夠并發(fā)執(zhí)行多少個(gè)任務(wù)焊虏。Hadoop1.0為了區(qū)分MapTask跟ReduceTask所使用資源的差異淡喜,進(jìn)一步將slot分為MapSlot跟ReduceSlot,他們分別只能被MapTask跟ReduceTask使用诵闭。

Hadoop集群管理員可根據(jù)各個(gè)節(jié)點(diǎn)硬件配置和應(yīng)用特點(diǎn)為它們分配不同的map slot數(shù)(由參數(shù)mapred.tasktracker.map.tasks.maximum指定)和reduce slot數(shù)(由參數(shù)mapred.tasktrackerreduce.tasks.maximum指定)

Hadoop1.0資源管理的缺點(diǎn)

靜態(tài)資源配置炼团。 采用了靜態(tài)資源設(shè)置策略,即每個(gè)節(jié)點(diǎn)事先配置好可用的slot總數(shù)涂圆,這些slot數(shù)目一旦啟動(dòng)后無法再動(dòng)態(tài)修改们镜。
資源無法共享币叹。 Hadoop 1.0將slot分為Map slot和Reduce slot兩種润歉,且不允許共享。對于一個(gè)作業(yè)颈抚,剛開始運(yùn)行時(shí)踩衩,Map slot資源緊缺而Reduce slot空閑,當(dāng)Map Task全部運(yùn)行完成后贩汉,Reduce slot緊缺而Map slot空閑驱富。很明顯,這種區(qū)分slot類別的資源管理方案在一定程度上降低了slot的利用率匹舞。
資源劃分粒度過大褐鸥。資源劃分粒度過大,往往會(huì)造成節(jié)點(diǎn)資源利用率過高或者過低 赐稽,比如叫榕,管理員事先規(guī)劃好一個(gè)slot代表2GB內(nèi)存和1個(gè)CPU,如果一個(gè)應(yīng)用程序的任務(wù)只需要1GB內(nèi)存姊舵,則會(huì)產(chǎn)生“資源碎片”晰绎,從而降低集群資源的利用率,同樣括丁,如果一個(gè)應(yīng)用程序的任務(wù)需要3GB內(nèi)存荞下,則會(huì)隱式地?fù)屨计渌蝿?wù)的資源,從而產(chǎn)生資源搶占現(xiàn)象史飞,可能導(dǎo)致集群利用率過高尖昏。
沒引入有效的資源隔離機(jī)制。Hadoop 1.0僅采用了基于jvm的資源隔離機(jī)制构资,這種方式仍過于粗糙会宪,很多資源,比如CPU蚯窥,無法進(jìn)行隔離掸鹅,這會(huì)造成同一個(gè)節(jié)點(diǎn)上的任務(wù)之間干擾嚴(yán)重塞帐。

Mapreduce到底是如何運(yùn)行的?

運(yùn)行流程
  1. 首先是客戶端要編寫好mapreduce程序,配置好mapreduce的作業(yè)也就是job巍沙。
  2. 接下來就是提交job了葵姥,提交job是提交到JobTracker上的,這個(gè)時(shí)候JobTracker就會(huì)構(gòu)建這個(gè)job句携,具體就是分配一個(gè)新的job任務(wù)的ID值榔幸,接下來它會(huì)做檢查操作,這個(gè)檢查就是確定輸出目錄是否存在矮嫉,如果存在那么job就不能正常運(yùn)行下去削咆,JobTracker會(huì)拋出錯(cuò)誤給客戶端,接下來還要檢查輸入目錄是否存在蠢笋,如果不存在同樣拋出錯(cuò)誤拨齐,如果存在JobTracker會(huì)根據(jù)輸入計(jì)算輸入分片(Input Split),如果分片計(jì)算不出來也會(huì)拋出錯(cuò)誤昨寞。
  3. 這些都做好了JobTracker就會(huì)配置Job需要的資源了瞻惋。分配好資源后,JobTracker就會(huì)初始化作業(yè)援岩,初始化主要做的是將Job放入一個(gè)內(nèi)部的隊(duì)列歼狼,讓配置好的作業(yè)調(diào)度器能調(diào)度到這個(gè)作業(yè),作業(yè)調(diào)度器會(huì)初始化這個(gè)job享怀,初始化就是創(chuàng)建一個(gè)正在運(yùn)行的job對象(封裝任務(wù)和記錄信息)羽峰,以便JobTracker跟蹤job的狀態(tài)和進(jìn)程。
  4. 初始化完畢后添瓷,作業(yè)調(diào)度器會(huì)獲取輸入分片信息(input split)梅屉,每個(gè)分片創(chuàng)建一個(gè)map任務(wù)。接下來就是任務(wù)分配了仰坦,這個(gè)時(shí)候tasktracker會(huì)運(yùn)行一個(gè)簡單的循環(huán)機(jī)制定期發(fā)送心跳給jobtracker履植,心跳間隔是5秒,程序員可以配置這個(gè)時(shí)間悄晃,心跳就是jobtracker和tasktracker溝通的橋梁玫霎,通過心跳,jobtracker可以監(jiān)控tasktracker是否存活妈橄,也可以獲取tasktracker處理的狀態(tài)和問題庶近,同時(shí)tasktracker也可以通過心跳里的返回值獲取jobtracker給它的操作指令。任務(wù)分配好后就是執(zhí)行任務(wù)了眷蚓。
  5. 在任務(wù)執(zhí)行時(shí)候jobtracker可以通過心跳機(jī)制監(jiān)控tasktracker的狀態(tài)和進(jìn)度鼻种,同時(shí)也能計(jì)算出整個(gè)job的狀態(tài)和進(jìn)度,而tasktracker也可以本地監(jiān)控自己的狀態(tài)和進(jìn)度沙热。當(dāng)jobtracker獲得了最后一個(gè)完成指定任務(wù)的tasktracker操作成功的通知時(shí)候叉钥,jobtracker會(huì)把整個(gè)job狀態(tài)置為成功罢缸,然后當(dāng)客戶端查詢job運(yùn)行狀態(tài)時(shí)候(注意:這個(gè)是異步操作),客戶端會(huì)查到j(luò)ob完成的通知的投队。如果job中途失敗枫疆,mapreduce也會(huì)有相應(yīng)機(jī)制處理,一般而言如果不是程序員程序本身有bug敷鸦,mapreduce錯(cuò)誤處理機(jī)制都能保證提交的job能正常完成息楔。

誰負(fù)責(zé)劃分split

主要是InputFormat。InputFormat類有2個(gè)重要的作用:
1)將輸入的數(shù)據(jù)切分為多個(gè)邏輯上的InputSplit扒披,其中每一個(gè)InputSplit作為一個(gè)map的輸入值依。
2)提供一個(gè)RecordReader,用于將InputSplit的內(nèi)容轉(zhuǎn)換為可以作為map輸入的k,v鍵值對碟案。

系統(tǒng)默認(rèn)的RecordReader是LineRecordReader愿险,它是TextInputFormat(FileInputFormat的子類)對應(yīng)的RecordReader; Map讀入的Key值是偏移量,Value是行內(nèi)容蟆淀。

邏輯處理流程圖

邏輯處理流程圖

兩個(gè)Mapper各自輸入一塊數(shù)據(jù)拯啦,由鍵值對構(gòu)成澡匪,對它進(jìn)行加工(加上了個(gè)字符n)熔任,然后按加工后的數(shù)據(jù)的鍵進(jìn)行分組,相同的鍵到相同的機(jī)器唁情。這樣的話疑苔,第一臺(tái)機(jī)器分到了鍵nk1和nk3,第二臺(tái)機(jī)器分到了鍵nk2甸鸟。

接下來再在這些Reducers上執(zhí)行聚合操作(這里執(zhí)行的是是count)惦费,輸出就是nk1出現(xiàn)了2次,nk3出現(xiàn)了1次抢韭,nk2出現(xiàn)了3次薪贫。從全局上來看,MapReduce就是一個(gè)分布式的GroupBy的過程刻恭。

從上圖可以看到瞧省,Global Shuffle左邊,兩臺(tái)機(jī)器執(zhí)行的是Map鳍贾。Global Shuffle右邊鞍匾,兩臺(tái)機(jī)器執(zhí)行的是Reduce。

大塊數(shù)據(jù)先流入map

Hadoop會(huì)將輸入數(shù)據(jù)劃分成等長的數(shù)據(jù)塊骑科,成為數(shù)據(jù)分片橡淑。Hadoop會(huì)為每個(gè)分片構(gòu)建一個(gè)map任務(wù)。并行的處理分片時(shí)間肯定會(huì)少于處理整個(gè)大數(shù)據(jù)塊的時(shí)間咆爽,但由于各個(gè)節(jié)點(diǎn)性能及作業(yè)運(yùn)行情況的不同梁棠,每個(gè)分片的處理時(shí)間可能不一樣置森,因此,把數(shù)據(jù)分片切分的更細(xì)可以得到更好的負(fù)載均衡符糊。

但另一方面暇藏,分片太小的話,管理分片和構(gòu)建map任務(wù)的時(shí)間將會(huì)增多濒蒋。因此盐碱,需要在hadoop分片大小和處理分片時(shí)間之間做一個(gè)權(quán)衡。對大多數(shù)作業(yè)來說沪伙,一個(gè)分片大小為64MB比較合適瓮顽,其實(shí),Hadoop的默認(rèn)塊大小也是64MB围橡。

我們上面看到了hadoop的數(shù)據(jù)塊大小與最佳分片大小相同暖混,這樣的話,數(shù)據(jù)分片就不容易跨數(shù)據(jù)塊存儲(chǔ)翁授,因此拣播,一個(gè)map任務(wù)的輸入分片便可以直接讀取本地?cái)?shù)據(jù)塊,這就避免了再從其它節(jié)點(diǎn)讀取分片數(shù)據(jù)收擦,從而節(jié)省了網(wǎng)絡(luò)開銷贮配。

map的任務(wù)輸出是寫入到本地磁盤而非HDFS的。那么為什么呢塞赂?因?yàn)閙ap任務(wù)輸出的是中間結(jié)果泪勒,一旦map任務(wù)完成即會(huì)被刪除,如果把它存入HDFS中并實(shí)現(xiàn)備份容錯(cuò)宴猾,未免有點(diǎn)大題小做圆存。如果一個(gè)map任務(wù)失敗,hadoop會(huì)再另一個(gè)節(jié)點(diǎn)重啟map一個(gè)map任務(wù)仇哆。

數(shù)據(jù)從map流入reduce

而reduce任務(wù)并不具備數(shù)據(jù)本地化優(yōu)勢——單個(gè)reduce任務(wù)的輸入通常來自所有mapper輸出沦辙。一般排序過的map輸出需要通過網(wǎng)絡(luò)傳輸發(fā)送到運(yùn)行reduce任務(wù)的節(jié)點(diǎn),并在reduce端進(jìn)行合并讹剔。reduce的輸出通常需要存儲(chǔ)到HDFS中以實(shí)現(xiàn)可靠存儲(chǔ)油讯。每個(gè)reduce輸出HDFS塊第一個(gè)復(fù)本會(huì)存儲(chǔ)在本地節(jié)點(diǎn),而其它復(fù)本則存儲(chǔ)到其它節(jié)點(diǎn)辟拷,因此reduce輸出也需要占用網(wǎng)絡(luò)帶寬撞羽。

為了實(shí)現(xiàn)Hadoop系統(tǒng)設(shè)計(jì)中 本地化計(jì)算 的原則,數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)DataNode與計(jì)算節(jié)點(diǎn)TaskTracker將合并設(shè)置衫冻,讓每個(gè)從節(jié)點(diǎn)同時(shí)運(yùn)行作為DataNode和TaskTracker诀紊,以此讓每個(gè)TaskTracker盡量處理存儲(chǔ)在本地DataNode上的數(shù)據(jù)

合理設(shè)置Reduce數(shù)

1.調(diào)整reduce個(gè)數(shù)方法(1)
(1)每個(gè)Reduce處理的數(shù)據(jù)量默認(rèn)是256MB

set hive.exec.reducers.bytes.per.reducer = 256000000

(2)每個(gè)任務(wù)最大的reduce數(shù),默認(rèn)為1009

set hive.exec.reducers.max = 1009

(3)計(jì)算reducer數(shù)的公式

N=min(參數(shù)2隅俘,總輸入數(shù)據(jù)量/參數(shù)1)

2.調(diào)整reduce個(gè)數(shù)方法(2)
在hadoop的mapred-default.xml文件中修改邻奠,設(shè)置每個(gè)job的Reduce個(gè)數(shù)

set mapreduce.job.reduces = 15;

3.reduce個(gè)數(shù)并不是越多越好
(1)過多的啟動(dòng)和初始化reduce也會(huì)消耗時(shí)間和資源笤喳;
(2)另外,有多少個(gè)reduce碌宴,就會(huì)有多少個(gè)輸出文件杀狡,如果產(chǎn)生了很多個(gè)小文件,那么如果這些小文件作為下一個(gè)任務(wù)的輸入贰镣,則也會(huì)出現(xiàn)小文件過多的問題呜象;
在設(shè)置reduce個(gè)數(shù)的時(shí)候也需要考慮這兩個(gè)原則:處理大數(shù)據(jù)利用適合的reduce數(shù);使單個(gè)reduce任務(wù)處理數(shù)據(jù)大小要合適碑隆;

流程分析

流程分析

Map端

在進(jìn)行map計(jì)算之前恭陡,mapreduce會(huì)根據(jù)輸入文件計(jì)算輸入分片(input split),每個(gè)輸入分片(input split)針對一個(gè)map任務(wù)上煤,輸入分片(input split)存儲(chǔ)的并非數(shù)據(jù)本身休玩,而是一個(gè)分片長度和一個(gè)記錄數(shù)據(jù)的位置的數(shù)組,輸入分片(input split)往往和hdfs的block(塊)關(guān)系很密切劫狠,我們沒有設(shè)置分片的范圍的時(shí)候拴疤,分片大小是由block塊大小決定的,和它的大小一樣独泞。

比如把一個(gè)258MB的文件上傳到HDFS上呐矾,假設(shè)block塊大小是128MB,那么它就會(huì)被分成三個(gè)block塊阐肤,與之對應(yīng)產(chǎn)生三個(gè)split凫佛,所以最終會(huì)產(chǎn)生三個(gè)map task孕惜。我又發(fā)現(xiàn)了另一個(gè)問題晨炕,第三個(gè)block塊里存的文件大小只有2MB,而它的block塊大小是128MB瓮栗,那它實(shí)際占用Linux file system的多大空間削罩?答案是實(shí)際的文件大小,而非一個(gè)塊的大小弥激。最后一個(gè)問題是: 如果hdfs占用Linux file system的磁盤空間按實(shí)際文件大小算愿阐,那么這個(gè)”塊大小“有必要存在嗎微服?其實(shí)塊大小還是必要的,一個(gè)顯而易見的作用就是當(dāng)文件通過append操作不斷增長的過程中缨历,可以通過來block size決定何時(shí)split文件以蕴。

1.每個(gè)輸入分片會(huì)讓一個(gè)map任務(wù)來處理,map輸出的結(jié)果會(huì)暫且放在一個(gè)環(huán)形內(nèi)存緩沖區(qū)中(該緩沖區(qū)的大小默認(rèn)為100M赡磅,由io.sort.mb屬性控制)宝与,當(dāng)該緩沖區(qū)快要溢出時(shí)(默認(rèn)為緩沖區(qū)大小的80%,由io.sort.spill.percent屬性控制)节值,會(huì)在本地文件系統(tǒng)中創(chuàng)建一個(gè)溢出文件榜聂,將該緩沖區(qū)中的數(shù)據(jù)寫入這個(gè)文件。

2.在寫入磁盤之前须肆,線程首先根據(jù)reduce任務(wù)的數(shù)目將數(shù)據(jù)劃分為相同數(shù)目的分區(qū)豌汇,也就是一個(gè)reduce任務(wù)對應(yīng)一個(gè)分區(qū)的數(shù)據(jù)。這樣做是為了避免有些reduce任務(wù)分配到大量數(shù)據(jù)拒贱,而有些reduce任務(wù)卻分到很少數(shù)據(jù)逻澳,甚至沒有分到數(shù)據(jù)的尷尬局面。其實(shí)分區(qū)就是對數(shù)據(jù)進(jìn)行hash的過程斜做。然后對每個(gè)分區(qū)中的數(shù)據(jù)進(jìn)行排序瓤逼,如果此時(shí)設(shè)置了Combiner,將排序后的結(jié)果進(jìn)行Combiner操作霸旗,主要是在map計(jì)算出中間文件前做一個(gè)簡單的合并重復(fù)key值的操作诱告,這樣做的目的是讓盡可能少的數(shù)據(jù)寫入到磁盤。

3.當(dāng)map任務(wù)輸出最后一個(gè)記錄時(shí),可能會(huì)有很多的溢出文件镀虐,這時(shí)需要將這些文件合并沟绪。合并的過程中會(huì)不斷地進(jìn)行排序和Combiner操作,目的有兩個(gè):1.盡量減少每次寫入磁盤的數(shù)據(jù)量恨旱;2.盡量減少下一復(fù)制階段網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量坝疼。最后合并成了一個(gè)已分區(qū)且已排序的文件。為了減少網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量仪芒,這里可以將數(shù)據(jù)壓縮耕陷,只要將mapred.compress.map.out設(shè)置為true就可以了。

4.將分區(qū)中的數(shù)據(jù)拷貝(網(wǎng)絡(luò)傳輸)給相對應(yīng)的reduce任務(wù)饺蔑。有人可能會(huì)問:分區(qū)中的數(shù)據(jù)怎么知道它對應(yīng)的reduce是哪個(gè)呢嗜诀?其實(shí)map任務(wù)一直和其父TaskTracker保持聯(lián)系隆敢,而TaskTracker又一直和JobTracker保持心跳。所以JobTracker中保存了整個(gè)集群中的宏觀信息筑公。只要reduce任務(wù)向JobTracker獲取對應(yīng)的map輸出位置就ok了哦匣屡。

Reduce端:
1.Reduce會(huì)接收到不同map任務(wù)傳來的數(shù)據(jù)拇涤,并且每個(gè)map傳來的數(shù)據(jù)都是有序的。如果reduce端接受的數(shù)據(jù)量相當(dāng)小券躁,則直接存儲(chǔ)在內(nèi)存中(緩沖區(qū)大小由mapred.job.shuffle.input.buffer.percent屬性控制,表示用作此用途的堆空間的百分比)以舒,如果數(shù)據(jù)量超過了該緩沖區(qū)大小的一定比例(由mapred.job.shuffle.merge.percent決定)慢哈,則對數(shù)據(jù)合并溢寫到磁盤中。

2.隨著溢寫文件的增多滥沫,后臺(tái)線程會(huì)將它們合并成一個(gè)更大的有序的文件键俱,這樣做是為了給后面的合并節(jié)省時(shí)間。其實(shí)不管在map端還是reduce端缀辩,MapReduce都是反復(fù)地執(zhí)行排序踪央,合并操作,現(xiàn)在終于明白了有些人為什么會(huì)說:排序是hadoop的靈魂镐牺。

3.合并的過程中會(huì)產(chǎn)生許多的中間文件(寫入磁盤了)魁莉,但MapReduce會(huì)讓寫入磁盤的數(shù)據(jù)盡可能地少,并且最后一次合并的結(jié)果并沒有寫入磁盤畦浓,而是直接輸入到reduce函數(shù)检疫。

詳細(xì)分析

詳細(xì)分析

Read階段:MapTask通過用戶編寫的RecordReader屎媳,從輸入InputSplit中解析出一個(gè)個(gè)key/value

Map階段:該節(jié)點(diǎn)主要是將解析出的key/value交給用戶編寫map()函數(shù)處理,并產(chǎn)生一系列新的key/value风响。

Collect收集階段:在用戶編寫map()函數(shù)中丹禀,當(dāng)數(shù)據(jù)處理完成后鞋怀,一般會(huì)調(diào)用OutputCollection.collect()輸出結(jié)果持搜。在該函數(shù)內(nèi)部葫盼,它會(huì)將生成的key/value分區(qū)(調(diào)用Partitioner),并寫入一個(gè)環(huán)形內(nèi)存緩沖區(qū)中废累。

Spill階段:即“溢寫”脱盲,當(dāng)環(huán)形緩沖區(qū)滿后,MapReduce會(huì)將數(shù)據(jù)寫入本地磁盤上掖看,生成一個(gè)臨時(shí)文件面哥。需要注意的是,將數(shù)據(jù)寫入本地磁盤之前归榕,先要對數(shù)據(jù)進(jìn)行一次本地排序吱涉,并在必要時(shí)對數(shù)據(jù)進(jìn)行combiner壓縮等操作特石。

溢寫階段詳情:

  1. 利用快速排序算法對緩存區(qū)內(nèi)的數(shù)據(jù)進(jìn)行排序鳖链,排序方式是,先按照分區(qū)編號(hào)partition進(jìn)行排序逞敷,然后按照key進(jìn)行排序题山。這樣,經(jīng)過排序后,數(shù)據(jù)以分區(qū)為單位聚集在一起慨菱,且同一分區(qū)內(nèi)所有數(shù)據(jù)按照key有序。

  2. 按照分區(qū)編號(hào)由小到大依次將每個(gè)分區(qū)中的數(shù)據(jù)寫入任務(wù)工作目錄下的臨時(shí)文件output/spillN.out(N表示當(dāng)前溢寫次數(shù))中闪彼。如果用戶設(shè)置Combiner协饲,則寫入文件之前,對每個(gè)分區(qū)中的數(shù)據(jù)進(jìn)行一次聚集操作描馅。

  3. 將分區(qū)數(shù)據(jù)的元信息寫到內(nèi)存索引數(shù)據(jù)結(jié)構(gòu)SpillRecord中而线,其中每個(gè)分區(qū)的元信息包括在臨時(shí)文件中的偏移量、壓縮前數(shù)據(jù)大小和壓縮后數(shù)據(jù)大小嘹狞。如果當(dāng)前內(nèi)存索引大小超過1MB誓竿,則將內(nèi)存索引寫到文件output/spillN.out.index中。

合并階段:當(dāng)所有數(shù)據(jù)處理完成后涧偷,MapTask對所有臨時(shí)文件進(jìn)行一次合并速蕊,以確保最終只會(huì)生成一個(gè)數(shù)據(jù)文件规哲。在進(jìn)行文件合并過程中,MapTask以分區(qū)為單位進(jìn)行合并唉锌。對于某個(gè)分區(qū)袄简,它將采用多輪遞歸合并的方式。每輪合并io.sort.factor(默認(rèn)100)個(gè)文件秃症,并將產(chǎn)生的文件重新加入待合并列表中,對文件排序后岗仑,重復(fù)以上過程聚请,直到最終得到一個(gè)大文件。讓一個(gè)MapTask最終只生成一個(gè)數(shù)據(jù)文件炸卑,可避免同時(shí)打開大量文件和同時(shí)讀取大量小文件產(chǎn)生的隨機(jī)讀取帶來的開銷煤傍。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末患久,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子返帕,更是在濱河造成了極大的恐慌篙挽,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件链韭,死亡現(xiàn)場離奇詭異敞峭,居然都是意外死亡蝉仇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門沉迹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鞭呕,“玉大人宛官,你說我怎么就攤上這事瓦糕〗Γ” “怎么了党晋?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵徐块,是天一觀的道長胡控。 經(jīng)常有香客問我,道長庇绽,這世上最難降的妖魔是什么橙困? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任凡傅,我火速辦了婚禮,結(jié)果婚禮上夏跷,老公的妹妹穿的比我還像新娘槽华。我一直安慰自己,他們只是感情好佣蓉,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布懂鸵。 她就那樣靜靜地躺著匆光,像睡著了一般。 火紅的嫁衣襯著肌膚如雪终息。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天喳张,我揣著相機(jī)與錄音美澳,去河邊找鬼。 笑死舅桩,一個(gè)胖子當(dāng)著我的面吹牛雨膨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撒妈,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼狰右,長吁一口氣:“原來是場噩夢啊……” “哼社露!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起附鸽,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤坷备,失蹤者是張志新(化名)和其女友劉穎情臭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竟秫,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肥败,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年馒稍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纽谒。...
    茶點(diǎn)故事閱讀 40,912評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鼓黔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出订歪,到底是詐尸還是另有隱情肆捕,我是刑警寧澤盖高,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布喻奥,位于F島的核電站,受9級(jí)特大地震影響润梯,放射性物質(zhì)發(fā)生泄漏甥厦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一舶赔、第九天 我趴在偏房一處隱蔽的房頂上張望谦秧。 院中可真熱鬧疚鲤,春花似錦、人聲如沸集歇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹬挺。三九已至,卻和暖如春溯泣,著一層夾襖步出監(jiān)牢的瞬間榕茧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工肢簿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留池充,地道東北人缎讼。 一個(gè)月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓血崭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親夹纫。 傳聞我的和親對象是個(gè)殘疾皇子捷凄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評論 2 361