1)設(shè)置ReduceTask
reducetask的并行度同樣影響整個job的執(zhí)行并發(fā)度和執(zhí)行效率爷辙,但與maptask的并發(fā)數(shù)由切片數(shù)決定不同胚委,Reducetask數(shù)量的決定是可以直接手動設(shè)置:
//默認值是1,手動設(shè)置為4
job.setNumReduceTasks(4);
2)注意
(1)reducetask=0 ,表示沒有reduce階段喜颁,輸出文件個數(shù)和map個數(shù)一致稠氮。
(2)reducetask默認值就是1,所以輸出文件個數(shù)為一個半开。
(3)如果數(shù)據(jù)分布不均勻隔披,就有可能在reduce階段產(chǎn)生數(shù)據(jù)傾斜
(4)reducetask數(shù)量并不是任意設(shè)置,還要考慮業(yè)務(wù)邏輯需求寂拆,有些情況下奢米,需要計算全局匯總結(jié)果,就只能有1個reducetask纠永。
(5)具體多少個reducetask鬓长,需要根據(jù)集群性能而定。
(6)如果分區(qū)數(shù)不是1尝江,但是reducetask為1涉波,是否執(zhí)行分區(qū)過程。答案是:不執(zhí)行分區(qū)過程炭序。因為在maptask的源碼中,執(zhí)行分區(qū)的前提是先判斷reduceNum個數(shù)是否大于1惭聂。不大于1肯定不執(zhí)行。
ReduceTask機制
運行流程詳見 Hadoop--MapReduce執(zhí)行過程
(1)Copy階段:ReduceTask從各個MapTask上遠程拷貝一片數(shù)據(jù)笨觅,并針對某一片數(shù)據(jù)耕腾,如果其大小超過一定閾值,則寫到磁盤上炮温,否則直接放到內(nèi)存中牵舵。
(2)Merge階段:在遠程拷貝數(shù)據(jù)的同時,ReduceTask啟動了兩個后臺線程對內(nèi)存和磁盤上的文件進行合并担巩,以防止內(nèi)存使用過多或磁盤上文件過多没炒。
(3)Sort階段:按照MapReduce語義,用戶編寫reduce()函數(shù)輸入數(shù)據(jù)是按key進行聚集的一組數(shù)據(jù)拳话。為了將key相同的數(shù)據(jù)聚在一起,Hadoop采用了基于排序的策略弃衍。由于各個MapTask已經(jīng)實現(xiàn)對自己的處理結(jié)果進行了局部排序镜盯,因此,ReduceTask只需對所有數(shù)據(jù)進行一次歸并排序即可降允。
(4)Reduce階段:reduce()函數(shù)將計算結(jié)果寫到HDFS上剧董。
Attention Please--文章來自互聯(lián)網(wǎng)資料整理,如有雷同翅楼,純屬李小李抄襲辱挥,如有侵權(quán)請聯(lián)系刪除 From 李小李