Hadoop框架下MapReduce中的map個(gè)數(shù)如何控制

一個(gè)job的map階段并行度由客戶端在提交job時(shí)決定

客戶端對map階段并行度的規(guī)劃基本邏輯為:
一、將待處理的文件進(jìn)行邏輯切片(根據(jù)處理數(shù)據(jù)文件的大小篡悟,劃分多個(gè)split),然后每一個(gè)split分配一個(gè)maptask并行處理實(shí)例
二、具體切片規(guī)劃是由FileInputFormat實(shí)現(xiàn)類的getSplits()方法完成

切分規(guī)則如下:
1.簡單地按照文件的內(nèi)容長度進(jìn)行切片
2.切片大小默認(rèn)是datanode的切塊大小128M
3.切片時(shí)不是考慮一個(gè)整體數(shù)據(jù)集纺座,而是針對每一個(gè)文件單獨(dú)切片
  比如待處理數(shù)據(jù)有兩個(gè)文件:
    file1.txt 200M
   file2.txt 50M
  經(jīng)過FileInputFormat的切片機(jī)制運(yùn)算后,形成的切片信息如下:
   file1.txt.split1– 0~128M —–maptask
   file1.txt.split2– 128M~200M —–maptask
   file2.txt.split1– 0~50M —–maptask
三貌嫡、如何改變切片大斜茸ぁ(參數(shù)設(shè)置)
源碼是通過這個(gè)方法來規(guī)劃切片大小的

protected long computeSplitSize(long blockSize, long minSize,
                                  long maxSize) {
    return 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:hdfs切片大小

調(diào)整切片大小結(jié)論:
maxsize(切片最大值):
  參數(shù)如果調(diào)得比blocksize小别惦,則會(huì)讓切片變小,而且就等于配置的這個(gè)參數(shù)的值
minsize (切片最小值):
  參數(shù)調(diào)的比blockSize大夫椭,則可以讓切片變得比blocksize還大


控制map個(gè)數(shù)的核心源碼

long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
 
//getFormatMinSplitSize 默認(rèn)返回1掸掸,getMinSplitSize 為用戶設(shè)置的最小分片數(shù), 如果用戶設(shè)置的大于1,則為用戶設(shè)置的最小分片數(shù)
long maxSize = getMaxSplitSize(job);
 
//getMaxSplitSize為用戶設(shè)置的最大分片數(shù)蹭秋,默認(rèn)最大為long 9223372036854775807L
 
long splitSize = computeSplitSize(blockSize, minSize,
                            maxSize);
 
protected long computeSplitSize(long blockSize, long minSize, long maxSize) {
        return Math.max(minSize, Math.min(maxSize, blockSize));
    }

由上述代碼可以看出在

maxSize默認(rèn)等于long(長整形)

blockSize默認(rèn)在hadoop2.0之后為128M

minSize默認(rèn)等于1

因此默認(rèn)的切片大小splitSize等于128M也就是說等于塊大小

一個(gè)切片對應(yīng)于一個(gè)map任務(wù)扰付,因此在默認(rèn)情況下一個(gè)塊對應(yīng)于一個(gè)map任務(wù)。

要想人為控制map的個(gè)數(shù)可以從minSize和MaxSize入手仁讨。

想要增加map的個(gè)數(shù)羽莺,可以將maxSize調(diào)整小于blockSize;想要減小map的個(gè)數(shù)洞豁,可以調(diào)整minSize>blockSize盐固。

具體調(diào)整可以在job配置中增加如下配置

FileInputFormat.setMinInputSplitSize(job, 301349250);//設(shè)置minSize
FileInputFormat.setMaxInputSplitSize(job, 10000);//設(shè)置maxSize
在實(shí)驗(yàn)中,

測試 文件大小 297M(311349250)

塊大小128M

測試代碼

FileInputFormat.setMinInputSplitSize(job, 301349250);

FileInputFormat.setMaxInputSplitSize(job, 10000);

測試后Map個(gè)數(shù)為1丈挟,由上面分片公式算出分片大小為301349250, 比 311349250小刁卜, 理論應(yīng)該為兩個(gè)map, 這是為什么呢?在上源碼

while (bytesRemaining / splitSize > 1.1D) {
                        int blkIndex = getBlockIndex(blkLocations, length
                                - bytesRemaining);
                        splits.add(makeSplit(path, length - bytesRemaining,
                                splitSize, blkLocations[blkIndex].getHosts()));

                        bytesRemaining -= splitSize;
                    }

可以看出只要剩余的文件大小不超過分片大小的1.1倍曙咽, 則會(huì)分到一個(gè)分片中蛔趴,避免開兩個(gè)MAP, 其中一個(gè)運(yùn)行數(shù)據(jù)太小例朱,浪費(fèi)資源孝情。

總結(jié),分片過程大概為洒嗤,先遍歷目標(biāo)文件咧叭,過濾部分不符合要求的文件, 然后添加到列表烁竭,然后按照文件名來切分分片 (大小為前面計(jì)算分片大小的公式, 最后有個(gè)文件尾可能合并菲茬,其實(shí)常寫網(wǎng)絡(luò)程序的都知道), 然后添加到分片列表派撕,然后每個(gè)分片讀取自身對應(yīng)的部分給MAP處理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末婉弹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子终吼,更是在濱河造成了極大的恐慌镀赌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件际跪,死亡現(xiàn)場離奇詭異商佛,居然都是意外死亡喉钢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門良姆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肠虽,“玉大人,你說我怎么就攤上這事玛追∷翱危” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵痊剖,是天一觀的道長韩玩。 經(jīng)常有香客問我,道長陆馁,這世上最難降的妖魔是什么找颓? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮叮贩,結(jié)果婚禮上叮雳,老公的妹妹穿的比我還像新娘。我一直安慰自己妇汗,他們只是感情好帘不,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杨箭,像睡著了一般寞焙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上互婿,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天捣郊,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滴肿,可吹牛的內(nèi)容都是我干的鹤啡。 我是一名探鬼主播蝙茶,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起琐旁,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猜绣,沒想到半個(gè)月后灰殴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掰邢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年牺陶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伟阔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掰伸,死狀恐怖皱炉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碱工,我是刑警寧澤娃承,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布奏夫,位于F島的核電站怕篷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏酗昼。R本人自食惡果不足惜廊谓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望麻削。 院中可真熱鬧蒸痹,春花似錦、人聲如沸呛哟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扫责。三九已至榛鼎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鳖孤,已是汗流浹背者娱。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苏揣,地道東北人黄鳍。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像平匈,于是被迫代替她去往敵國和親框沟。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容