切片過程從jobsubmitter的writesplits()開始
---step into getsplits() 開始獲取新的切片
首先會選出format預設最小值和配置檔案中設定的切片最小值 二者中最大的乙個
getformatmainsplitsize()預設返回值為1
getminsplitsize()中,如果配置檔案未設定切片大小的話,預設值為1
getmaxsplitsize()方法,如果配置檔案中未設定切片最大值的的話預設為long型別最大值
獲取files檔案集合
迴圈遍歷files集合並獲取路徑和長度資訊,此過程說明了在進行資料切分的時候是對每乙個檔案且依照長度進行切分的
切分前需要判斷檔案時候可以切割(如一些壓縮檔案切割後就無法使用)
獲取blocksize = 33554432 計算blocksize/1024/1024 = 32m
這個結果在不同情況下可能不不同,因為此時我是在本地執行的,可能由於考慮到本地機器效能
所以預設分配blocksize為32m,如果在集群中執行的話會預設為128m
假設我們要儲存乙個65m的檔案,首先 65/32 > 1.1會建立第乙個切片
然後 (65-32) / 32 < 1.1 但是還有33m的資料沒有儲存,那麼這33m會共同放在第二個切片中
所以當在本地執行時,乙個65m的資料會分在兩個切片儲存,並把這個切片放在split集合中
接下來會重新進入迴圈來遍歷切分下乙個 檔案
為何是1.1?
切分完成後直接返回splits集合
再將集合轉成陣列(便於排序),長度為切片的個數
並對切片進行排序
最終返回陣列長度(也是切片的個數,返回給maps,需要保證maptasks和maps的數量一致)
繼續返回maps給jobsubmitter中的maps
MapReduce原始碼分析心得
分布式計算追求 沒有計算發生。支撐了計算向資料移動,和計算的並行度。做的最主要的是 儲存與計算解耦,就是對所要進行切片的資料進行split切片,split map並行度 split預設是與block塊數量一致,目的是為了計算向資料移動,幾個block塊分布在幾個地方,就起幾個map,這樣就不需要讓大...
MapReduce流程講解以及原始碼分析
對於使用者來說只需要書寫map操作和reduce操作 mapreduce計算資料的時間較長 整個過程分為map和reduce,map負責處理原始資料,reduce負責處理map資料 1.map過程 block 塊 物理上的概念,預設是128m split 切片 本次map任務要處理的資料的大小 預設...
MapReduce原始碼 二
下圖是context類的繼承關係 不同層次的類的互動物件有所不同 mapcontext 關注 recordreaderreader 和 inputsplit split taskinputoutputcontext關注 recordwriteroutput statusreporter report...