首頁技術(shù)文章正文

大數(shù)據(jù)離線階段Day8之MapReduce并行度機制

更新時間:2018-10-24 來源:黑馬程序員 瀏覽量:

  1. MapTask并行度機制

  MapTask的并行度指的是map階段有多少個并行的task共同處理任務(wù)。map階段的任務(wù)處理并行度,勢必影響到整個job的處理速度。那么,MapTask并行實例是否越多越好呢?其并行度又是如何決定呢?

  一個MapReducejob的map階段并行度由客戶端在提交job時決定,即客戶端提交job之前會對待處理數(shù)據(jù)進(jìn)行邏輯切片。切片完成會形成切片規(guī)劃文件(job.split),每個邏輯切片最終對應(yīng)啟動一個maptask。

  邏輯切片機制由FileInputFormat實現(xiàn)類的getSplits()方法完成。

  FileInputFormat切片機制

  FileInputFormat中默認(rèn)的切片機制:

  A. 簡單地按照文件的內(nèi)容長度進(jìn)行切片

  B. 切片大小,默認(rèn)等于block大小

  C. 切片時不考慮數(shù)據(jù)集整體,而是逐個針對每一個文件單獨切片

  比如待處理數(shù)據(jù)有兩個文件:

  file1.txt 320M

  file2.txt 10M

  經(jīng)過FileInputFormat的切片機制運算后,形成的切片信息如下:

  file1.txt.split1—0M~128M

  file1.txt.split2—128M~256M

  file1.txt.split3—256M~320M

  file2.txt.split1—0M~10M

  FileInputFormat中切片的大小的參數(shù)配置

  在FileInputFormat中,計算切片大小的邏輯:

  Math.max(minSize, Math.min(maxSize, blockSize));

  切片主要由這幾個值來運算決定:

  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小,則會讓切片變小,而且就等于配置的這個參數(shù)的。

  minsize (切片最小值):參數(shù)調(diào)的比blockSize大,則可以讓切片變得比blocksize還大。

  但是,不論怎么調(diào)參數(shù),都不能讓多個小文件“劃入”一個split。

  還有個細(xì)節(jié)就是:

  當(dāng)bytesRemaining/splitSize > 1.1不滿足的話,那么最后所有剩余的會作為一個切片。從而不會形成例如129M文件規(guī)劃成兩個切片的局面。

  2. Reducetask并行度機制

  reducetask并行度同樣影響整個job的執(zhí)行并發(fā)度和執(zhí)行效率,與maptask的并發(fā)數(shù)由切片數(shù)決定不同,Reducetask數(shù)量的決定是可以直接手動設(shè)置:

  job.setNumReduceTasks(4);

  如果數(shù)據(jù)分布不均勻,就有可能在reduce階段產(chǎn)生數(shù)據(jù)傾斜。

  注意: reducetask數(shù)量并不是任意設(shè)置,還要考慮業(yè)務(wù)邏輯需求,有些情況下,需要計算全局匯總結(jié)果,就只能有1個reducetask。

  3. Task并行度經(jīng)驗之談

  最好每個task的執(zhí)行時間至少一分鐘。

  如果job的每個map或者 reduce task的運行時間都只有30-40秒鐘,那么就減少該job的map或者reduce數(shù),每一個task(map|reduce)的setup和加入到調(diào)度器中進(jìn)行調(diào)度,這個中間的過程可能都要花費幾秒鐘,所以如果每個task都非常快就跑完了,就會在task的開始和結(jié)束的時候浪費太多的時間。

  此外,默認(rèn)情況下,每一個task都是一個新的JVM實例,都需要開啟和銷毀的開銷。在一些情況下,JVM開啟和銷毀的時間可能會比實際處理數(shù)據(jù)的時間要消耗的長,配置task的JVM重用可以改善該問題:

  (mapred.job.reuse.jvm.num.tasks,默認(rèn)是1,表示一個JVM上最多可以順序執(zhí)行的task數(shù)目(屬于同一個Job)是1。也就是說一個task啟一個JVM)

  如果input的文件非常的大,比如1TB,可以考慮將hdfs上的每個block size設(shè)大,比如設(shè)成256MB或者512MB





作者 :黑馬程序員大數(shù)據(jù)培訓(xùn)學(xué)院
首發(fā):http://cloud.itheima.com

分享到:
在線咨詢 我要報名
和我們在線交談!