更新時(shí)間:2018-10-24 來源:黑馬程序員 瀏覽量:
1. MapTask并行度機(jī)制
MapTask的并行度指的是map階段有多少個(gè)并行的task共同處理任務(wù)。map階段的任務(wù)處理并行度,勢(shì)必影響到整個(gè)job的處理速度。那么,MapTask并行實(shí)例是否越多越好呢?其并行度又是如何決定呢?
一個(gè)MapReducejob的map階段并行度由客戶端在提交job時(shí)決定,即客戶端提交job之前會(huì)對(duì)待處理數(shù)據(jù)進(jìn)行邏輯切片。切片完成會(huì)形成切片規(guī)劃文件(job.split),每個(gè)邏輯切片最終對(duì)應(yīng)啟動(dòng)一個(gè)maptask。
邏輯切片機(jī)制由FileInputFormat實(shí)現(xiàn)類的getSplits()方法完成。
FileInputFormat切片機(jī)制
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—0M~128M
file1.txt.split2—128M~256M
file1.txt.split3—256M~320M
file2.txt.split1—0M~10M
FileInputFormat中切片的大小的參數(shù)配置
在FileInputFormat中,計(jì)算切片大小的邏輯:
Math.max(minSize, Math.min(maxSize, blockSize));
切片主要由這幾個(gè)值來運(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)情況下,split size=blocksize,在hadoop 2.x中為128M。
maxsize(切片最大值):參數(shù)如果調(diào)得比blocksize小,則會(huì)讓切片變小,而且就等于配置的這個(gè)參數(shù)的。
minsize (切片最小值):參數(shù)調(diào)的比blockSize大,則可以讓切片變得比blocksize還大。
但是,不論怎么調(diào)參數(shù),都不能讓多個(gè)小文件“劃入”一個(gè)split。
還有個(gè)細(xì)節(jié)就是:
當(dāng)bytesRemaining/splitSize > 1.1不滿足的話,那么最后所有剩余的會(huì)作為一個(gè)切片。從而不會(huì)形成例如129M文件規(guī)劃成兩個(gè)切片的局面。
2. Reducetask并行度機(jī)制
reducetask并行度同樣影響整個(gè)job的執(zhí)行并發(fā)度和執(zhí)行效率,與maptask的并發(fā)數(shù)由切片數(shù)決定不同,Reducetask數(shù)量的決定是可以直接手動(dòng)設(shè)置:
job.setNumReduceTasks(4);
如果數(shù)據(jù)分布不均勻,就有可能在reduce階段產(chǎn)生數(shù)據(jù)傾斜。
注意: reducetask數(shù)量并不是任意設(shè)置,還要考慮業(yè)務(wù)邏輯需求,有些情況下,需要計(jì)算全局匯總結(jié)果,就只能有1個(gè)reducetask。
3. Task并行度經(jīng)驗(yàn)之談
最好每個(gè)task的執(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都非常快就跑完了,就會(huì)在task的開始和結(jié)束的時(shí)候浪費(fèi)太多的時(shí)間。
此外,默認(rèn)情況下,每一個(gè)task都是一個(gè)新的JVM實(shí)例,都需要開啟和銷毀的開銷。在一些情況下,JVM開啟和銷毀的時(shí)間可能會(huì)比實(shí)際處理數(shù)據(jù)的時(shí)間要消耗的長(zhǎng),配置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
作者
:黑馬程序員大數(shù)據(jù)培訓(xùn)學(xué)院
首發(fā):http://cloud.itheima.com
云計(jì)算-基于KVM的H3C云計(jì)算平臺(tái)CAS的一些運(yùn)維經(jīng)驗(yàn)
2018-08-09搭建Python獨(dú)立環(huán)境:virtualenv的應(yīng)用
2018-07-27大數(shù)據(jù)入門Hadoop安裝
2018-07-272019版大數(shù)據(jù)學(xué)習(xí)路線圖(含大綱+視頻+工具+教材+面試)
2018-05-14云計(jì)算大數(shù)據(jù):spark與storm比對(duì)與選型
2018-01-23【云計(jì)算大數(shù)據(jù)】Java面試題之?dāng)?shù)據(jù)庫(kù)三范式是什么
2018-01-10