準(zhǔn)確的說羞酗,map個(gè)數(shù)是指map task的個(gè)數(shù)殴俱,map task可以看作進(jìn)程养交,并發(fā)執(zhí)行一個(gè)job任務(wù)。
在map階段讀取數(shù)據(jù)前枕荞,F(xiàn)ileInputFormat會(huì)將輸入文件分割成split柜候。split的個(gè)數(shù)決定了map的個(gè)數(shù)。影響map個(gè)數(shù)(split個(gè)數(shù))的主要因素有:
? 1) 文件的大小躏精。當(dāng)塊(dfs.block.size)為128m時(shí)渣刷,如果輸入文件為128m,會(huì)被劃分為1個(gè)split矗烛;當(dāng)塊為256m辅柴,會(huì)被劃分為2個(gè)split。
? 2) 文件的個(gè)數(shù)。FileInputFormat按照文件分割split碌嘀,并且只會(huì)分割大文件涣旨,即那些大小超過HDFS塊的大小的文件。如果HDFS中dfs.block.size設(shè)置為128m股冗,而輸入的目錄中文件有100個(gè)霹陡,則劃分后的split個(gè)數(shù)至少為100個(gè)。
? 3) splitsize的大小魁瞪。分片是按照splitszie的大小進(jìn)行分割的穆律,一個(gè)split的大小在沒有設(shè)置的情況下,默認(rèn)等于hdfs block的大小导俘。但應(yīng)用程序可以通過兩個(gè)參數(shù)來對(duì)splitsize進(jìn)行調(diào)節(jié)
? ? InputSplit=Math.max(minSize, Math.min(maxSize, blockSize)
? ? 其中:
? ? ? minSize=mapred.min.split.size
? ? ? maxSize=mapred.max.split.size
? ? 我們可以在MapReduce程序的驅(qū)動(dòng)部分添加如下代碼:
? ? ? TextInputFormat.setMinInputSplitSize(job,1024L); // 設(shè)置最小分片大小
? ? ? TextInputFormat.setMaxInputSplitSize(job,1024×1024×10L); // 設(shè)置最大分片大小
? ? 總結(jié)如下:
? ? ? 當(dāng)mapreduce.input.fileinputformat.split.maxsize > mapreduce.input.fileinputformat.split.minsize > dfs.blockSize的情況下,此時(shí)的splitSize 將由mapreduce.input.fileinputformat.split.minsize參數(shù)決定
? ? ? 當(dāng)mapreduce.input.fileinputformat.split.maxsize > dfs.blockSize > mapreduce.input.fileinputformat.split.minsize的情況下剔蹋,此時(shí)的splitSize 將由dfs.blockSize配置決定
? ? ? 當(dāng)dfs.blockSize > mapreduce.input.fileinputformat.split.maxsize > mapreduce.input.fileinputformat.split.minsize的情況下旅薄,此時(shí)的splitSize將由mapreduce.input.fileinputformat.split.maxsize參數(shù)決定。