在CGFT考試中也是要學(xué)習(xí)這樣的知識(shí)的,大數(shù)據(jù)知識(shí)的學(xué)習(xí)是比較難的,那你對(duì)讀數(shù)據(jù)的過(guò)程知道多少了?今天小編給你說(shuō)說(shuō)哦!讓你有個(gè)簡(jiǎn)單的了解!
?
(1)客戶端通過(guò)FileSystem.open(打開(kāi)文件,相應(yīng)地,在HDFS文件系統(tǒng)中,DistributedFileSystem具體實(shí)現(xiàn)了 FileSystem,因此,調(diào)用open()方法后,DistributedFileSystem會(huì)創(chuàng)建輸入流FSDatalnputStream,對(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)行排序;然后,DistributedFileSystem會(huì)利用DFSInputStream來(lái)實(shí)例化FSDataInputStream,返回給客戶端,同時(shí)返回了數(shù)據(jù)塊的數(shù)據(jù)節(jié)點(diǎn)地址。
(3)獲得輸入流FSDatalnputStream后,客戶端調(diào)用read()函數(shù)開(kāi)始讀取數(shù)據(jù)。輸入流根據(jù)前面的排序結(jié)果,選擇距離客戶端*近的數(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ù)塊(如果客戶端緩存中已經(jīng)包含了該數(shù)據(jù)塊的位置信息,就不需要調(diào)用該方法)。
大數(shù)據(jù)技術(shù)原理與應(yīng)用——概念、存儲(chǔ)、處理、分析與應(yīng)用
(6)找到該數(shù)據(jù)塊的*數(shù)據(jù)節(jié)點(diǎn),讀取數(shù)據(jù)。
(7)當(dāng)客戶端讀取完畢數(shù)據(jù)的時(shí)候,調(diào)用FSDatalnputStream的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)。