shuffle過(guò)程參數(shù)調(diào)優(yōu)
Map端的調(diào)優(yōu)屬性
io.sort.mb int 100 排序Map輸出是所使用內(nèi)存緩沖區(qū)的大小铺董,以MB為單位
io.sort.record.percent float 0.05 用作存儲(chǔ)Map輸出記錄邊界的io.sort.mb的比例,剩余的空間存儲(chǔ)Map輸出記錄本身
io.sort.spill.percent float 0.8 Map輸出內(nèi)存緩沖和用來(lái)開始磁盤溢出寫過(guò)程的記錄邊界索引岸蜗,是兩者使用比例的閥值
io.sort.factor boolean false 排序文件時(shí)援雇,一次最后合并的流數(shù)缨恒,這個(gè)屬性也在Reduce端使用蜂绎,將閥值增加到100是很常用的
mapred.compress.map.output 壓縮Map的輸出
mapred.map.out.compression.codec class org.apache.hadoop.io.compress.DefaultCodec 用于Map輸出的壓碼編碼解碼
min.num.spills.for.combinar int 3 運(yùn)行Combinar所需要的最小溢出寫文件數(shù)
tasktracker.http.threads int 40 每個(gè)TaskTracker工作的線程數(shù)熬词,用于將Map輸出到Reduce這是集群范圍的設(shè)置旁钧,不能有單個(gè)作業(yè)來(lái)設(shè)置
Reduce端的調(diào)優(yōu)屬性
mapred.reduce.parallel.copies int 5 每個(gè)Reduce并行下載Map結(jié)果的最大線程數(shù)
mapred.reduce.copy.backoff int 300 Reduce下載線程最大等待時(shí)間(in sec)
io.sort.factor int 10 同上
mapred.job.shuffle.input.buffer.percent float 0.7 用來(lái)緩存Shuffle數(shù)據(jù)的reduce task heap百分比
mapred.job.shuffle.merge.percent float 0.66 緩存的內(nèi)存中多少百分比后開始做merge操作
mapred.job.reduce.input.buffer.percent float 0.0 sort完成后Reduce計(jì)算階段用來(lái)緩存數(shù)據(jù)的百分比
Shuffle調(diào)優(yōu)的總原則就是給Shuffle過(guò)程盡量多地提供內(nèi)存空間,然后有一個(gè)平衡的問(wèn)題吸重,要確保map函數(shù)和reduce函數(shù)能夠得到足夠的內(nèi)存來(lái)運(yùn)行
運(yùn)行Map任務(wù)和Reduce任務(wù)的JVM,其內(nèi)存大小由參數(shù)mapred.child.java.opts來(lái)設(shè)置歪今,任務(wù)節(jié)點(diǎn)上面的內(nèi)存大小應(yīng)盡量大
任務(wù)的執(zhí)行##
推測(cè)執(zhí)行
對(duì)于相同的輸入數(shù)據(jù)嚎幸,我們可以并行多次處理以利用不同的機(jī)器的負(fù)載能力
因?yàn)樽鳂I(yè)中大多數(shù)的任務(wù)都已經(jīng)完成了,Hadoop平臺(tái)會(huì)在幾個(gè)空閑的節(jié)點(diǎn)上調(diào)度執(zhí)行剩余任務(wù)的復(fù)制
當(dāng)任務(wù)完成時(shí)寄猩,它會(huì)向JobTracker通告嫉晶,任何一個(gè)首先完成的復(fù)制任務(wù)將成為權(quán)威復(fù)制,如果其他復(fù)制任務(wù)還在推測(cè)性執(zhí)行田篇,Hadoop會(huì)告訴TaskTracker去終止這些任務(wù)并丟棄它們的輸出车遂,接著Reduce會(huì)從首先完成的Mapper那里獲取輸入數(shù)據(jù)
推測(cè)性執(zhí)行默認(rèn)是啟用的,設(shè)置JobConf中的mapred.map.tasks.speculative.execution和mapred.reduce.tasks.speculative.execution為false斯辰,用來(lái)禁止map和Reduce的推測(cè)性執(zhí)行
>**任務(wù)JVM重用**
mapred.job.reuse.jvm.num.tasks的默認(rèn)值為1舶担,即每一個(gè)Task都新啟動(dòng)一個(gè)JVM來(lái)運(yùn)行,而當(dāng)值為-1時(shí)彬呻,表示JVM可以無(wú)限制重用
當(dāng)值為-1時(shí)衣陶,TaskTracker也是先判斷當(dāng)前節(jié)點(diǎn)是否有空閑的slot剩余,如果沒(méi)有空閑的slot槽位闸氮,才會(huì)判斷當(dāng)前分配的slot槽位中的JVM是否已經(jīng)將當(dāng)前的Task任務(wù)運(yùn)行完剪况,如果Task已經(jīng)運(yùn)行完,才會(huì)復(fù)用當(dāng)前JVM(當(dāng)前只針對(duì)同一個(gè)Job的Task才會(huì)進(jìn)入JVM的復(fù)用)
>**跳過(guò)壞的記錄**
數(shù)據(jù)的一些記錄不符合規(guī)范蒲跨,處理時(shí)拋出異常译断,MapReduce可以將這次記錄標(biāo)為壞記錄,重啟任務(wù)時(shí)會(huì)跳過(guò)該記錄
默認(rèn)情況下該屬性是關(guān)閉的或悲,通過(guò)mapred.map.max.attemps和mapred.reduce.max.attemps兩個(gè)參數(shù)進(jìn)行設(shè)置
作業(yè)調(diào)度器
Hadoop作業(yè)調(diào)度器采用的是插件機(jī)制孙咪,即作業(yè)調(diào)度器是動(dòng)態(tài)加載的 、可插拔的巡语、同時(shí)第三方可以開發(fā)自己的作業(yè)調(diào)度器替代Hadoop默認(rèn)的調(diào)度器翎蹈。目前,Hadoop作業(yè)調(diào)度器主要有以下三個(gè):
1.先進(jìn)先出調(diào)度器(FIFO Scheduler)
默認(rèn)的調(diào)度器男公,所有用戶的作業(yè)都被提交到一個(gè)隊(duì)列中荤堪,然后由JobTracker先按照作業(yè)的優(yōu)先級(jí)高低,再按照作業(yè)提交時(shí)間的先后順序選擇將被執(zhí)行的作業(yè)
缺點(diǎn):忽略了不同作業(yè)的需求差異
2.容量調(diào)度器(Capacity Scheduler)
容量調(diào)度器的每個(gè)隊(duì)列中采用的調(diào)度策略是FIFO算法
容量調(diào)度器默認(rèn)情況下不支持優(yōu)先級(jí)枢赔,但是可以在配置文件中開啟此選項(xiàng) 澄阳,如果支持優(yōu)先級(jí),調(diào)度算法就是帶有優(yōu)先級(jí)的FIFO
容量調(diào)度器不支持優(yōu)先級(jí)搶占踏拜,一旦一個(gè)作業(yè)開始執(zhí)行碎赢,在執(zhí)行完成之前它的資源不會(huì)被高優(yōu)先級(jí)作業(yè)所搶占
容量調(diào)度器對(duì)隊(duì)列中同一用戶提交的作業(yè)能夠獲得的資源百分比進(jìn)行限制,以避免同屬于一個(gè)用戶的作業(yè)獨(dú)占資源的情況
3.公平調(diào)度器(Fair Scheduler)
公平調(diào)度器的設(shè)計(jì)思想是执隧,盡可能保證所有的作業(yè)都能夠獲得等量的資源份額揩抡。
系統(tǒng)中只有一個(gè)作業(yè)執(zhí)行時(shí)户侥,它將獨(dú)占集群所有的資源,有其他作業(yè)被提交時(shí)就會(huì)有TaskTracker被釋放并分配給新提交的作業(yè)峦嗤,以保證所有的作業(yè)都能夠獲得大體相同的計(jì)算資源
最低保障資源份額機(jī)制蕊唐?
用戶提交的作業(yè)將會(huì)放進(jìn)一個(gè)能夠公平共享資源的池中,每個(gè)作業(yè)池設(shè)定了一個(gè)最低資源保障烁设,當(dāng)一個(gè)池中包含Job時(shí)替梨,它至少可以獲得minimum share的資源
默認(rèn)情況下,每個(gè)作業(yè)池中選擇將要執(zhí)行作業(yè)的策略是FIFO策略装黑,先按照優(yōu)先級(jí)高低排序副瀑,然后按照提交時(shí)間排序
默認(rèn)情況下,公平調(diào)度器會(huì)為每個(gè)用戶建立一個(gè)單獨(dú)的pool恋谭,所有的用戶能夠獲得等量的資源份額而無(wú)論提交了多少作業(yè)糠睡,而每個(gè)pool中,各個(gè)作業(yè)將平分分配所在池的資源