簡單搞定FileInputFormat切片機制
1)job提交流程原始碼詳解
waitForCompletion()
submit();
// 1建立連線
connect();
// 1)建立提交job的代理
newCluster(getConfiguration());
//(1)判斷是本地yarn還是遠端
initialize(jobTrackAddr, conf);
// 2提交job
submitter.submitJobInternal(Job.this, cluster)
// 1)建立給叢集提交資料的Stag路徑
Path jobStagingArea = JobSubmissionFiles.getStagingDir
// 2)獲取jobid,並建立job路徑
JobID jobId = submitClient.getNewJobID();
// 3)拷貝jar包到叢集
copyAndConfigureFiles(job, submitJobDir);
rUploader.uploadFiles(job, jobSubmitDir);
// 4)計算切片,生成切片規劃檔案
writeSplits(job, submitJobDir);
maps = writeNewSplits(job, jobSubmitDir);
input.getSplits(job);
// 5
writeConf(conf, submitJobFile);
conf.writeXml(out);
// 6)提交job,返回提交狀態
status = submitClient.submitJob(jobId, submitJobDir.toString(), job.getCredentials());
2 FileInputFormat原始碼解析
(1)找到你資料儲存的目錄。
(2)開始遍歷處理(規劃切片)目錄下的每一個檔案
(3)遍歷第一個檔案ss.txt
a)獲取檔案大小fs.sizeOf(ss.txt);
b)計算切片大小computeSliteSize(Math.max(minSize,Math.max(maxSize,blocksize)))=blocksize=128M
c)開始切,形成第1個切片:ss.txt—0:128M第2個切片ss.txt—128:256M第3個切片ss.txt—256M:300M(每次切片時,都要判斷切完剩下的部分是否大於塊的1.1倍,不大於1.1倍就劃分一塊切片)
d)將切片資訊寫到一個切片規劃檔案中
f)整個切片的核心過程在getSplit()方法中完成。
(4)提交切片規劃檔案到yarn上,yarn上的MrAppMaster就可以根據切片規劃檔案計算開啟maptask個數。
3)FileInputFormat中預設的切片機制:
(1)簡單地按照檔案的內容長度進行切片
(2)切片大小,預設等於block大小
(3)切片時不考慮資料集整體,而是逐個針對每一個檔案單獨切片
比如待處理資料有兩個檔案:
file1.txt 320M file2.txt 10M |
file1.txt.split1-- 0~128 file1.txt.split2-- 128~256 file1.txt.split3-- 256~320 file2.txt.split1-- 0~10M |
4)FileInputFormat切片大小的引數配置
(1)通過分析原始碼,在FileInputFormat中,計算切片大小的邏輯:Math.max(minSize, Math.min(maxSize, blockSize));
切片主要由這幾個值來運算決定
mapreduce.input.fileinputformat.split.minsize=1預設值為1
mapreduce.input.fileinputformat.split.maxsize= Long.MAXValue預設值Long.MAXValue
因此,預設情況下,切片大小=blocksize。
maxsize(切片最大值):引數如果調得比blocksize小,則會讓切片變小,而且就等於配置的這個引數的值。
minsize(切片最小值):引數調的比blockSize大,則可以讓切片變得比blocksize還大。
(2)選擇併發數的影響因素:
a)運算節點的硬體配置
b)運算任務的型別:CPU密集型還是IO密集型
c)運算任務的資料量
5)獲取切片資訊API
//根據檔案型別獲取切片資訊 FileSplit inputSplit = (FileSplit) context.getInputSplit(); //獲取切片的檔名稱 String name = inputSplit.getPath().getName(); |