1. 程式人生 > >Hadoop如何計算map數和reduce數

Hadoop如何計算map數和reduce數

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等待釋放資源。

Hive對於上面描述的情況有一種補救措施,引數hive.merge.smallfiles.avgsize控制hive對output小檔案的合併,當hiveoutput的檔案的平均大小小於hive.merge.smallfiles.avgsize-預設為16MB左右,hive啟動一個附加的mapreducejob合併小檔案,合併後文件大小不超過hive.merge.size.per.task-預設為256MB。

儘管Hive可以啟動小檔案合併的過程,但會消耗掉額外的計算資源,控制單個reduce task的輸出大小>64MB才是最好的解決辦法。

map資料計算示例:

hive> set dfs.block.size;
dfs.block.size=268435456
hive> set mapred.map.tasks;
mapred.map.tasks=2

檔案塊大小為256MB,map.tasks為2

檢視檔案大小和檔案數:
[[email protected] hadoop]$ hadoop dfs -ls /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25;
Found 18 items
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  290700555 2012-11-26 19:00 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000000_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  290695945 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000001_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  290182606 2012-11-26 19:00 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000002_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  271979933 2012-11-26 19:00 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000003_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258448208 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000004_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258440338 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000005_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258419852 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000006_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258347423 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000007_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258349480 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000008_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258301657 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000009_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258270954 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000010_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258266805 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000011_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258253133 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000012_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258236047 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000013_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258239072 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000014_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258170671 2012-11-26 19:00 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000015_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258160711 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000016_0
-rw-r-----   3 alidwicbu cug-alibaba-dw-icbu  258085783 2012-11-26 18:59 /group/alibaba-dw-icbu/hive/bdl_en12_pageview_fatdt0_d/hp_stat_date=2012-11-25/attempt_201211151327_1675393_m_000017_0

檔案: 大小Bytes 大小MB splitsize(MB) 每個檔案需要的map數量
檔案1 290700555 277.2336531 256 1.082943957
檔案2 290695945 277.2292566 256 1.082926784
檔案3 290182606 276.7396984 256 1.081014447
檔案4 271979933 259.3802767 256 1.013204206
檔案5 258448208 246.4754181 256 0.962794602
檔案6 258440338 246.4679127 256 0.962765284
檔案7 258419852 246.4483757 256 0.962688968
檔案8 258347423 246.379302 256 0.962419149
檔案9 258349480 246.3812637 256 0.962426811
檔案10 258301657 246.3356562 256 0.962248657
檔案11 258270954 246.3063755 256 0.962134279
檔案12 258266805 246.3024187 256 0.962118823
檔案13 258253133 246.2893801 256 0.962067891
檔案14 258236047 246.2730856 256 0.962004241
檔案15 258239072 246.2759705 256 0.96201551
檔案16 258170671 246.2107382 256 0.961760696
檔案17 258160711 246.2012396 256 0.961723592
檔案18 258085783 246.1297827 256 0.961444464
總檔案大小: 4759549173 4539.059804


goalSize = 4539.059804 (檔案總大小)/ mapred.map.tasks(2) = 2269.529902MB

因此splitsize取值為256MB,所以一共分配18個map。

修改map.tasks引數為32
set mapred.map.tasks = 32;
檔案: 大小Bytes 大小MB splitsize(MB) 每個檔案需要的map數量
檔案1 290700555 277.2336531 141.8 1.955103336
檔案2 290695945 277.2292566 141.8 1.955072332
檔案3 290182606 276.7396984 141.8 1.951619876
檔案4 271979933 259.3802767 141.8 1.829198002
檔案5 258448208 246.4754181 141.8 1.738190537
檔案6 258440338 246.4679127 141.8 1.738137607
檔案7 258419852 246.4483757 141.8 1.737999829
檔案8 258347423 246.379302 141.8 1.737512708
檔案9 258349480 246.3812637 141.8 1.737526543
檔案10 258301657 246.3356562 141.8 1.737204909
檔案11 258270954 246.3063755 141.8 1.736998417
檔案12 258266805 246.3024187 141.8 1.736970513
檔案13 258253133 246.2893801 141.8 1.736878562
檔案14 258236047 246.2730856 141.8 1.73676365
檔案15 258239072 246.2759705 141.8 1.736783995
檔案16 258170671 246.2107382 141.8 1.736323965
檔案17 258160711 246.2012396 141.8 1.736256979
檔案18 258085783 246.1297827 141.8 1.735753051
總檔案大小: 4759549173 4539.059804


goalSize = 4539.059804 / mapred.map.tasks(32)  = 141.8456189

因此splitsize取值為141.8MB,所以一共分配36個map。

相關推薦

Hadoop如何計算mapreduce

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

Hadoop】Hive優化之——控制hive任務中的mapreduce

一、控制hive任務中的map數: 1.通常情況下,作業會通過input的目錄產生一個或者多個map任務。  主要的決定因素有: input的檔案總個數,input的檔案大小,叢集設定的檔案塊大小(目

hive優化之——控制hive任務中的mapreduce

計算 2-0 問題 tdi title ask hadoop 發現 http 一、 控制hive任務中的map數: 1. 通常情況下,作業會通過input的目錄產生一個或者多個map任務。主要的決定因素有: input的文件總個數,input的文件大小,集群設

python全棧開發【補充】mapreduce的區別

lambda mage 多個 計算 兩個 數值 ima 所有 post ①從參數方面來講:map()函數:  map()包含兩個參數,第一個是參數是一個函數,第二個是序列(列表或元組)。其中,函數(即map的第一個參數位置的函數)可以接收一個或多個參數。reduce()函數

VS 計算二維陣列的行

對於一個二維陣列如: int a[2][5]; 求陣列元素的總數: sizeof(a) / sizeof(int) 而陣列行數則為 :( sizeof(a) / sizeof(int) )/ ( sizeof(a[0]) / sizeof(int) ) 求陣列列數: si

hadoop中slot簡介(map slot reduce slot)

Slots是Hadoop的一個重要概念。然而在Hadoop相關論文,slots的闡述難以理解。網上關於slots的概念介紹也很少,而對於一個有經驗的Hadoop開發者來說,他們可能腦子裡已經理解了slots的真正含義,但卻難以清楚地表達出來,Hadoop初學者聽了還是雲裡

hadoop 分片與分塊,map taskreduce task的理解

 分塊:Block   HDFS儲存系統中,引入了檔案系統的分塊概念(block),塊是儲存的最小單位,HDFS定義其大小為64MB。與單磁碟檔案系統相似,儲存在 HDFS上的檔案均儲存為多個塊,不同的是,如果某檔案大小沒有到達64MB,該檔案也不會佔據整個塊空間。在分

c++語言 如何計算二維陣列行

對於一個二維陣列如: int a[2][5]; 求陣列元素的總數: sizeof(a) / sizeof(int) 而陣列行數則為 :( sizeof(a) / sizeof(int) )/ ( sizeof(a[0]) / sizeof(int) ) 求陣列列數: siz

式編程

pythonpython的過程就是函數,因為解釋器會隱式地返回默認值None。實際編程中大部分偏函數更接近過程,不顯示地返回任何東西。當沒有顯示地返回元素或者如果返回None時,python會返回一個None。* 元組 ** 字典def子句的剩余部分包括了一個雖然可選但是強烈推薦的文檔字串和必須的函

軟件工程作業個人項目: wc項目,統計文本文件的字符、單詞

platform 行數 文本文件 chang cpp word 文件的 string || 1、代碼來源: http://www.cnblogs.com/changjiangcheng/p/5304120.html 2、platform: windows VC++

Kotlin 函表達式

lin 返回 clas int 創建一個函數 spa str rgs 表達式 學習了kotlin 的控制。 其中最為強大的是各種控制可以直接作為表達式來使用。 那麽在kotlin中,函數也是可以作為表達式來使用。 而且kotlin中函數的創建方式有很多方式。 第一種:

Java 組 獲取二維組的行

怎樣 tps lan 個數 元素 mil family 資料 object   對於Object[][] array,array.length返回行數,array[0].length返回列數,元素個數為array.length*array[0].length。   參考

Java獲得數據庫查詢結果的列,打印查詢結果

rman execute .get name 數據庫查詢 隨筆 while cti etc Java連接數據庫及簡單操作見我以前的一篇隨筆:http://www.cnblogs.com/meitian/p/5036332.html 一、獲取查詢結果的行數和列數 查詢結果

怎麽查找關於內核參的說明文檔

pad 註意 grep命令 安裝 style cal ont sys left Linux內核源代碼釋出時會包含有一些關於內核參數(如sysctl.conf中的參數)和函數的說明文檔,在CentOS/RedHat系統中,kernel-doc軟件包裏面打包的就是這些文檔(也可

普通函模板在一起研究

nbsp 在一起 分享 mage 圖片 png com info alt 1.函數模板和普通函數在一起的研究 1) 2) 普通函數和函數模板在一起研究

指針函指針

編譯 簡潔 clas 程序實現 指向 返回 main inline end 函數指針:指向函數的指針變量,在C編譯時,每一個函數都有一個入口地址,那麽指向這個函數的函數指針便是指向這個地址。函數指針主要有兩個作用:用作調用函數和做函數的參數。 int (*func)(int

C#中二維組的行

取數 word 二維數組 同學 定義 dimen 行數 nbsp col 最近在項目中用到二維數組,需要獲取數組的行數和列數,本以為是很簡單的一些東西,卻發現網上好多答案都是錯誤的,遂寫下隨筆,希望之後有用到的同學們能夠順利解決答案。 下面是一些關於數組的一些屬性和方法以及

VBA取得EXCEL表格中的行

VBA取得EXCEL表格中的行數和列數       初學EXCEL巨集的童鞋,總是很想知道表格中含有資料的行數和列數,尤其是行數和列數不確定的情況下。這樣可以避免很多的錯誤,並且可以提高效率。但每次用到的時候到網上查詢時,總是給了很多無用的答案,往往找不到想要的

mapreduce端引數的調優策略

原文https://blog.csdn.net/qq_26442553/article/details/78760338 使用hadoop進行大資料運算,當資料量及其大時,那麼對MapReduce效能的調優重要性不言而喻。尤其是Shuffle過程中的引數配置對作業的總執行時間影響特別大。下面基於

python中的map()函式reduce()函式

map()函式的用法: map(函式function_name, 可迭代物件Iterable) map()函式接受兩個引數,一個是函式,一個是可迭代物件。map()函式將傳入的函式一次作用在序列的每一個元素,並把結果作為新的可迭代物件返回。 舉例說明,比