1. 程式人生 > >簡單搞定FileInputFormat切片機制

簡單搞定FileInputFormat切片機制

1 FileInputFormat切片機制

1job提交流程原始碼詳解

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

(cluster,conf);

// 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

)向Stag路徑寫xml配置檔案

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:128M2個切片ss.txt—128:256M3個切片ss.txt—256M:300M(每次切片時,都要判斷切完剩下的部分是否大於塊的1.1倍,不大於1.1倍就劃分一塊切片

              d)將切片資訊寫到一個切片規劃檔案中

              f)整個切片的核心過程在getSplit()方法中完成。

4)提交切片規劃檔案到yarn上,yarn上的MrAppMaster就可以根據切片規劃檔案計算開啟maptask個數。

3FileInputFormat中預設的切片機制:

1)簡單地按照檔案的內容長度進行切片

2)切片大小,預設等於block大小

3)切片時不考慮資料集整體,而是逐個針對每一個檔案單獨切片

比如待處理資料有兩個檔案:

file1.txt    320M

file2.txt    10M

經過FileInputFormat的切片機制運算後,形成的切片資訊如下:

file1.txt.split1--  0~128

file1.txt.split2--  128~256

file1.txt.split3--  256~320

file2.txt.split1--  0~10M

4FileInputFormat切片大小的引數配置

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();