黑猴子的家 FileInputFormat切片機制

2021-08-30 08:44:13 字數 2901 閱讀 9930

1、job提交流程原始碼詳解

waitforcompletion()

submit();

// 1、建立連線

connect();

// 1)建立提交job的**

new cluster(getconfiguration());

// 2)判斷是本地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,返回提交狀態

2、fileinputformat原始碼解析(input.getsplits(job))

(1)找到你資料儲存的目錄。

(2)開始遍歷處理(規劃切片)目錄下的每乙個檔案

(3)遍歷第乙個檔案ss.txt

a)獲取檔案大小fs.sizeof(ss.txt);

b)計算切片大小

computeslitesize(math.max(minsize,math.min(maxsize,blocksize)))=blocksize=128m

c)預設情況下,切片大小=blocksize

d)開始切,形成第1個切片:ss.txt—0:128m 第2個切片ss.txt—128:256m 第3個切片ss.txt—256m:300m(每次切片時,都要判斷切完剩下的部分是否大於塊的1.1倍,不大於1.1倍就劃分一塊切片)

e)將切片資訊寫到乙個切片規劃檔案中

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

g)資料切片只是在邏輯上對輸入資料進行分片,並不會再磁碟上將其切分成分片進行儲存。inputsplit只記錄了分片的元資料資訊,比如起始位置、長度以及所在的節點列表等。

h)注意:block是hdfs上物理上儲存的儲存的資料,切片是對資料邏輯上的劃分。

3、fileinputformat中預設的切片機制

(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

4、fileinputformat切片大小的引數配置

通過分析原始碼,在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還大。

5、獲取切片資訊api

// 根據檔案型別獲取切片資訊

filesplit inputsplit = (filesplit) context.getinputsplit();

// 獲取切片的檔名稱

string name = inputsplit.getpath().getname();

黑猴子的家 Hadoop Checkpoint機制

fsimage和edit log合併的過程如下圖所示 其實這個合併過程是乙個很耗i o與cpu的操作,並且在進行合併的過程中肯定也會有其他應用繼續訪問和修改hdfs檔案。所以,這個過程一般不是在單一的namenode節點上進行從。如果hdfs沒有做ha的話,checkpoint由secondname...

黑猴子的家 Zookeeper Java API

1 code github 2 環境準備 1 建立乙個工程 2 解壓zookeeper 3.4.10.tar.gz檔案 3 拷貝zookeeper 3.4.10.jar jline 0.9.94.jar log4j 1.2.16.jar netty 3.10.5.final.jar slf4j ap...

黑猴子的家 Git 安裝

2 開始安裝 git 選擇git命令的執行環境,這裡推薦選擇第乙個,就是單獨使用者git自己的命令列視窗。不推薦和windows的命令列視窗混用。在 configuring the line ending conversions 選項中 第乙個選項 如果是跨平台專案,在windows系統安裝,選擇 ...