上次小編說了讀取數(shù)據(jù)的過程,今天小編給你說說怎么寫數(shù)據(jù),這是很重要的知識,跟CGFT考試中的讀數(shù)據(jù)是相對的哦!


(1)客戶端通過FileSystem.create()創(chuàng)建文件。

相應(yīng)地,在HDFS文件系統(tǒng)中,DistributedFile System具體實(shí)現(xiàn)了FileSystem,因此,調(diào)用crea0方法后,DistributedFileSystem會創(chuàng)建輸出流對象FSDataOutputStream,對于HDFS而言,具體的輸出流就是DFSOutputStream。

(2)然后,DistributedFileSystem通過RPC遠(yuǎn)程調(diào)用名稱節(jié)點(diǎn),在文件系統(tǒng)的命名空間中佳建一個新的文件。名稱節(jié)點(diǎn)會執(zhí)行一些檢查,比如文件是否已經(jīng)存在,客戶端是否有權(quán)限創(chuàng)建文件等。檢查通過之后,名稱節(jié)點(diǎn)會構(gòu)造一個新文件,并添加文件信息。遠(yuǎn)程方法調(diào)用結(jié)束后,DistributedFileSystem會利用DFSOutputStream來實(shí)例化FSDataOutputStream,返回給客戶端,客戶端使用這個輸出流寫人數(shù)據(jù)。

(3)獲得輸出流FSDataOutputStream以后,客戶端調(diào)用輸出流的write()方法向HDFS中對應(yīng)的文件寫入數(shù)據(jù)。

(4)客戶端向輸出流FSDataOutputStream中寫入的數(shù)據(jù),會首先被分成一個個的分包,這些分包被放入DFSOutputStream對象的內(nèi)部隊(duì)列。輸出流FSDataOutputStream會向名稱節(jié)點(diǎn)申請保存文件和副本數(shù)據(jù)塊的若干個數(shù)據(jù)節(jié)點(diǎn),這些數(shù)據(jù)節(jié)點(diǎn)形成一個數(shù)據(jù)流管道。隊(duì)列中的分包*后被打包成數(shù)據(jù)包,發(fā)往數(shù)據(jù)流管道中的*個數(shù)據(jù)節(jié)點(diǎn),*個數(shù)據(jù)節(jié)點(diǎn)將數(shù)據(jù)包發(fā)送給第二個數(shù)據(jù)節(jié)點(diǎn),第二個數(shù)據(jù)節(jié)點(diǎn)將數(shù)據(jù)包發(fā)送給第三個數(shù)據(jù)節(jié)點(diǎn),這樣,數(shù)據(jù)包會流經(jīng)管道上的各個數(shù)據(jù)節(jié)點(diǎn)(即第3.5.2節(jié)介紹的流水線復(fù)制策略)。

(5)因?yàn)楦鱾€數(shù)據(jù)節(jié)點(diǎn)位于不同機(jī)器上,數(shù)據(jù)需要通過網(wǎng)絡(luò)發(fā)送,因此,為了*所有數(shù)據(jù)節(jié)點(diǎn)的數(shù)據(jù)都是*的,接收到數(shù)據(jù)的數(shù)據(jù)節(jié)點(diǎn)要向發(fā)送者發(fā)送“確認(rèn)包”(ACK Packet)。確認(rèn)包沿著數(shù)據(jù)流管道逆流而上,從數(shù)據(jù)流管道依次經(jīng)過各個數(shù)據(jù)節(jié)點(diǎn)并*終發(fā)往客戶端,當(dāng)客戶端收到應(yīng)答時,它將對應(yīng)的分包從內(nèi)部隊(duì)列移除。不斷執(zhí)行(3)~(5)步,直到數(shù)據(jù)全部寫完。

(6)客戶端調(diào)用close()方法關(guān)閉輸出流,此時開始,客戶端不會再向輸出流中寫入數(shù)據(jù),所以,當(dāng)DFSOutputStream對象內(nèi)部隊(duì)列中的分包都收到應(yīng)答以后,就可以使用ClientProtocol.complete()方法通知名稱節(jié)點(diǎn)關(guān)閉文件,完成一次正常的寫文件過程。