Hadoop如何計算map數和reduce數

2021-06-27 15:32:22 字數 2028 閱讀 9976

hadoop在執行乙個mapreduce job之前,需要估算這個job的maptask數和reducetask數。首先分析一下job的maptask數,當乙個job提交時,jobclient首先分析job被拆分的split數量,然後吧job.split檔案放置在hdfs中,乙個job的maptask數量就等於split的個數。

job.split中包含split的個數由fileinputformat.getsplits計算出,方法的邏輯如下:

1.  讀取引數mapred.map.tasks,這個引數預設設定為0,生產系統中很少修改。

2.  計算input檔案的總位元組數,總位元組數/(mapred.map.tasks==0 ? 1: mapred.map.tasks )=goalsize

3.  每個split的最小值minsize由mapred.min.split.size引數設定,這個引數預設設定為0,生產系統中很少修改。

4.  呼叫computesplitsize方法,計算出splitsize= math.max(minsize, math.min(goalsize, blocksize)),通常這個值=blocksize,輸入的檔案較小,檔案位元組數之和小於blocksize時,splitsize=輸入檔案位元組數之和。

5.  對於input的每個檔案,計算split的個數。

a)  檔案大小/splitsize>1.1,建立乙個split,這個split的位元組數=splitsize,檔案剩餘位元組數=檔案大小-splitsize

b)  檔案剩餘位元組數/splitsize<1.1,剩餘的部分作為乙個split

舉例說明:

1.  input只有乙個檔案,大小為100m,splitsize=blocksize,則split數為2,第乙個split為64m,第二個為36m

2.  input只有乙個檔案,大小為65m,splitsize=blocksize,則split數為1,split大小為65m

3.  input只有乙個檔案,大小為129m,splitsize=blocksize,則split數為2,第乙個split為64m,第二個為65m(最後乙個split的大小可能超過splitsize)

4.  input只有乙個檔案,大小為20m ,splitsize=blocksize,則split數為1,split大小為20m

5.  input有兩個檔案,大小為100m和20m,splitsize=blocksize,則split數為3,第乙個檔案分為兩個split,第乙個split為64m,第二個為36m,第二個檔案為乙個split,大小為20m

6.  input有兩個檔案,大小為25m和20m,splitsize=blocksize,則split數為2,第乙個檔案為乙個split,大小為25m,第二個檔案為乙個split,大小為20m

假設乙個job的input大小固定為100m,當只包含乙個檔案時,split個數為2,maptask數為2,但當包含10個10m的檔案時,maptask數為10。

下面來分析reducetask,純粹的mapreduce task的reduce task數很簡單,就是引數mapred.reduce.tasks的值,hadoop-site.xml檔案中和mapreduce job執行時不設定的話預設為1。

在hive中執行sql的情況又不同,hive會估算reduce task的數量,估算方法如下:

通常是ceil(input檔案大小/1024*1024*1024),每1gb大小的輸入檔案對應乙個reduce task。

特殊的情況是當sql只查詢count(*)時,reduce task數被設定成1。

總結:通過map和reducetask數量的分析可以看出,hadoop/hive估算的map和reduce task數可能和實際情況相差甚遠。假定某個job的input資料量龐大,reduce task數量也會隨之變大,而通過join和group by,實際output的資料可能不多,但reduce會輸出大量的小檔案,這個job的下游任務將會啟動同樣多的map來處理前面reduce產生的大量檔案。在生產環境中每個user group有乙個map task數的限額,乙個job啟動大量的map task很顯然會造成其他job等待釋放資源。

hadoop 控制map任務數詳解

但是通過這種方式設定map的個數,並不是每次都有效的。原因是mapred.map.tasks只是乙個hadoop的參考數值,最終map的個數,還取決於其他的因素。為了方便介紹,先來看幾個名詞 block size hdfs的檔案塊大小,預設為64m,可以通過引數dfs.block.size設定 to...

如何在hadoop控制map個數

hadooop提供了乙個設定map個數的引數mapred.map.tasks,我們可以通過這個引數來控制map的個數。但是通過這種方式設定map的個數,並不是每次都有效的。原因是mapred.map.tasks只是乙個hadoop的參考數值,最終map的個數,還取決於其他的因素。為了方便介紹,先來看...

hive 的map數和reduce如何確定

一 控制hive任務中的map數 1.通常情況下,作業會通過input的目錄產生乙個或者多個map任務。主要的決定因素有 input的檔案總個數,input的檔案大小,集群設定的檔案塊大小 目前為128m,可在hive中通過set dfs.block.size 命令檢視到,該引數不能自定義修改 2....