上次小編說了讀取數(shù)據(jù)的過程,今天小編給你說說怎么寫數(shù)據(jù),這是很重要的知識,跟CGFT考試中的讀數(shù)據(jù)是相對的哦!
(1)客戶端通過FileSystem.create()創(chuàng)建文件。
相應(yīng)地,在HDFS文件系統(tǒng)中,DistributedFile System具體實現(xiàn)了FileSystem,因此,調(diào)用crea0方法后,DistributedFileSystem會創(chuàng)建輸出流對象FSDataOutputStream,對于HDFS而言,具體的輸出流就是DFSOutputStream。
(2)然后,DistributedFileSystem通過RPC遠程調(diào)用名稱節(jié)點,在文件系統(tǒng)的命名空間中佳建一個新的文件。名稱節(jié)點會執(zhí)行一些檢查,比如文件是否已經(jīng)存在,客戶端是否有權(quán)限創(chuàng)建文件等。檢查通過之后,名稱節(jié)點會構(gòu)造一個新文件,并添加文件信息。遠程方法調(diào)用結(jié)束后,DistributedFileSystem會利用DFSOutputStream來實例化FSDataOutputStream,返回給客戶端,客戶端使用這個輸出流寫人數(shù)據(jù)。
(3)獲得輸出流FSDataOutputStream以后,客戶端調(diào)用輸出流的write()方法向HDFS中對應(yīng)的文件寫入數(shù)據(jù)。
(4)客戶端向輸出流FSDataOutputStream中寫入的數(shù)據(jù),會首先被分成一個個的分包,這些分包被放入DFSOutputStream對象的內(nèi)部隊列。輸出流FSDataOutputStream會向名稱節(jié)點申請保存文件和副本數(shù)據(jù)塊的若干個數(shù)據(jù)節(jié)點,這些數(shù)據(jù)節(jié)點形成一個數(shù)據(jù)流管道。隊列中的分包*后被打包成數(shù)據(jù)包,發(fā)往數(shù)據(jù)流管道中的*個數(shù)據(jù)節(jié)點,*個數(shù)據(jù)節(jié)點將數(shù)據(jù)包發(fā)送給第二個數(shù)據(jù)節(jié)點,第二個數(shù)據(jù)節(jié)點將數(shù)據(jù)包發(fā)送給第三個數(shù)據(jù)節(jié)點,這樣,數(shù)據(jù)包會流經(jīng)管道上的各個數(shù)據(jù)節(jié)點(即第3.5.2節(jié)介紹的流水線復制策略)。
(5)因為各個數(shù)據(jù)節(jié)點位于不同機器上,數(shù)據(jù)需要通過網(wǎng)絡(luò)發(fā)送,因此,為了*所有數(shù)據(jù)節(jié)點的數(shù)據(jù)都是*的,接收到數(shù)據(jù)的數(shù)據(jù)節(jié)點要向發(fā)送者發(fā)送“確認包”(ACK Packet)。確認包沿著數(shù)據(jù)流管道逆流而上,從數(shù)據(jù)流管道依次經(jīng)過各個數(shù)據(jù)節(jié)點并*終發(fā)往客戶端,當客戶端收到應(yīng)答時,它將對應(yīng)的分包從內(nèi)部隊列移除。不斷執(zhí)行(3)~(5)步,直到數(shù)據(jù)全部寫完。
(6)客戶端調(diào)用close()方法關(guān)閉輸出流,此時開始,客戶端不會再向輸出流中寫入數(shù)據(jù),所以,當DFSOutputStream對象內(nèi)部隊列中的分包都收到應(yīng)答以后,就可以使用ClientProtocol.complete()方法通知名稱節(jié)點關(guān)閉文件,完成一次正常的寫文件過程。