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


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

相應地,在HDFS文件系統中,DistributedFile System具體實現了FileSystem,因此,調用crea0方法后,DistributedFileSystem會創建輸出流對象FSDataOutputStream,對于HDFS而言,具體的輸出流就是DFSOutputStream

(2)然后,DistributedFileSystem通過RPC遠程調用名稱節點,在文件系統的命名空間中佳建一個新的文件。名稱節點會執行一些檢查,比如文件是否已經存在,客戶端是否有權限創建文件等。檢查通過之后,名稱節點會構造一個新文件,并添加文件信息。遠程方法調用結束后,DistributedFileSystem會利用DFSOutputStream來實例化FSDataOutputStream,返回給客戶端,客戶端使用這個輸出流寫人數據。

(3)獲得輸出流FSDataOutputStream以后,客戶端調用輸出流的write()方法向HDFS中對應的文件寫入數據。

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

(5)因為各個數據節點位于不同機器上,數據需要通過網絡發送,因此,為了*所有數據節點的數據都是*的,接收到數據的數據節點要向發送者發送“確認包”(ACK Packet)。確認包沿著數據流管道逆流而上,從數據流管道依次經過各個數據節點并*終發往客戶端,當客戶端收到應答時,它將對應的分包從內部隊列移除。不斷執行(3)~(5)步,直到數據全部寫完。

(6)客戶端調用close()方法關閉輸出流,此時開始,客戶端不會再向輸出流中寫入數據,所以,當DFSOutputStream對象內部隊列中的分包都收到應答以后,就可以使用ClientProtocol.complete()方法通知名稱節點關閉文件,完成一次正常的寫文件過程。