在CGFT大數(shù)據(jù)技術(shù)中,讀數(shù)據(jù)的過(guò)程是很重要的。具體有什么,隨融躍小編往下看!
客戶端連續(xù)調(diào)用open()、read()、close()讀取數(shù)據(jù)時(shí),HDFS內(nèi)部的執(zhí)行過(guò)程:
1. 客戶端通過(guò)filesystem.open()打開(kāi)文件,相應(yīng)的,在HDFS文件系統(tǒng)中,disterbutedfilesysrem具體體現(xiàn)了filesystem,因此,調(diào)用open()后,disterbutedfilesysrem會(huì)創(chuàng)建輸入流filesystem,而對(duì)于HDFS而言,具體的輸入流就是dfsinputstream。
2. 在dfsinputstream的構(gòu)造函數(shù)中,輸入流通過(guò)clientProtocal.getblocklocations()遠(yuǎn)程調(diào)用名稱節(jié)點(diǎn),獲得文件開(kāi)始部分?jǐn)?shù)據(jù)塊的保存位置。對(duì)于該數(shù)據(jù)塊,名稱節(jié)點(diǎn)返回保存該數(shù)據(jù)塊的所有數(shù)據(jù)節(jié)點(diǎn)的地址,同時(shí),根據(jù)距離客戶端的遠(yuǎn)近對(duì)數(shù)據(jù)節(jié)點(diǎn)進(jìn)行排序。然后,disterbutedfilesysrem會(huì)利用dfsinputstream來(lái)實(shí)例化fsdatainputstream,返回給客戶端,同時(shí)返回了數(shù)據(jù)塊的數(shù)據(jù)節(jié)點(diǎn)地址。
3. 獲得輸入流fsdatainputstream后,客戶端調(diào)用read()函數(shù)開(kāi)始讀取數(shù)據(jù)。輸入流根據(jù)前面的排序結(jié)果,選擇距離客戶端zui近的數(shù)據(jù)節(jié)點(diǎn)建立連接并讀取數(shù)據(jù)。
4. 數(shù)據(jù)從該數(shù)據(jù)節(jié)點(diǎn)讀到客戶端,當(dāng)該數(shù)據(jù)塊讀取完畢時(shí),fsdatainputstream關(guān)閉和該數(shù)據(jù)節(jié)點(diǎn)的連接。
5. 輸入流通過(guò)getblocklocations()方法查找下一個(gè)數(shù)據(jù)塊。
6. 找到該數(shù)據(jù)塊的zui佳數(shù)據(jù)節(jié)點(diǎn),讀取數(shù)據(jù)。
7. 當(dāng)客戶端讀取完畢數(shù)據(jù)的時(shí)候,調(diào)用fsdatainputstream的close()函數(shù),關(guān)閉輸入流。
需要注意的是,在讀取數(shù)據(jù)的過(guò)程中,如果客戶端與數(shù)據(jù)節(jié)點(diǎn)通信時(shí)出現(xiàn)錯(cuò)誤,就會(huì)嘗試連接包含此數(shù)據(jù)塊的下一個(gè)數(shù)據(jù)節(jié)點(diǎn)。
