image.png
1.工作流程
- 簡述版:inputformat ->mapTask ->reduceTask ->outoutputformat
- 詳細版:inputformat->map(sort ) -> reduce(copy sort reduce) -> outoutputformat
2.inputformat 數(shù)據(jù)輸入
切塊:數(shù)據(jù)在儲存在HDFS上時皱埠,物理上先進行,按照blocksize進行切塊
切片: 數(shù)據(jù)在計算的時候黄鳍,讀取過程,把文件按照按照塊的大小進行去劃分窃款,這樣做是為了防止跨機器去讀取數(shù)據(jù)(并不會在磁盤上將其切分成片進行存儲课兄。數(shù)據(jù)切片是MapReduce程序計算輸入數(shù)據(jù)的單位)
切片對應(yīng)的注意點: 1每一個切片都對應(yīng)著一個MapTask,
2.默認(rèn)切片的大小就是一個塊的大小
3.默認(rèn)情況下,切片只針對一個文件的本身晨继,不考慮數(shù)據(jù)的整體
3.inputFormat結(jié)構(gòu)體系(源碼解析)
- fileInputFormat inputformat的子實現(xiàn)烟阐,實現(xiàn)切片邏輯
- textInputformat fileInputFormat的子實現(xiàn)類,實現(xiàn)讀取數(shù)據(jù)的邏輯
--getSplits() 負責(zé)對文件的切片
--createRecordReader() 負責(zé)創(chuàng)建一個RecordReader來進行數(shù)據(jù)讀取
FileInputFormat 負責(zé)切片
FileInputFormat .png
-
TextInputFormat負責(zé)讀取
TextInputFormat.png -
CombineTextInputFormat切片機制(專門用來處理小文件的)
框架默認(rèn)的TextInputFormat切片機制是對任務(wù)按文件規(guī)劃切片紊扬,不管文件多小蜒茄,都會是一個單獨的切片,都會交給一個MapTask餐屎,這樣如果有大量小文件檀葛,就會產(chǎn)生大量的MapTask,處理效率極其低下腹缩。
image.png
4.Partitiner 分區(qū)
- 默認(rèn)分區(qū)
根據(jù)當(dāng)前key的hashcode值和 ReduceTask的數(shù)量取余 得出分區(qū)編號
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; -
自定義分區(qū)
ReduceTask的數(shù)量決定分區(qū)的數(shù)量屿聋。
以手機號流量統(tǒng)計案例為例 (5個分區(qū))
-- 設(shè)置的 ReduceTaskNum > 5 -->不會報錯,也不影響分區(qū)操作庆聘,但是會多出來一個空分區(qū)文件胜臊。
-- < ReduceTaskNum < 5 會報錯,不符合邏輯
-- ReduceTaskNum = 1伙判,走默認(rèn)規(guī)則象对,就不會走定義的規(guī)則。
image.png