1. 程式人生 > >HDFS中的數據流

HDFS中的數據流

取數 ima 位置 nbsp 流式 需要 封裝 read 列表

博客內容來自我啃的Hadoop權威指南,記錄一下幫助自己理一下思路

一、文件讀取

技術分享圖片

  • 步驟1,客戶端通過調用 FileSystem 對象的 open() 方法來打開想讀取的文件,對於 HDFS 來說,這個對象是分布式文件系統(DistributedFileSystem)的一個實例
  • 步驟2,DistributedFileSystem 通過使用 RPC 來調用 namenode ,獲取文件的存儲位置,以確定文件起始塊的位置。namenode 返回文件所有組成塊的副本的 datanode 地址。並且這些 datanode 地址信息是已經排過序的。DistributedFileSystem 的 open() 方法返回一個 FSDataInputStream 對象給客戶端讀取數據。FSDataInputStream 類封裝了DFSInputStream 對象,該對象管理著 datanode 和 namenode 的 I/O。
  • 步驟3,客戶端對 FSDataInputStream 對象調用 read() 方法,存儲著文件起始幾個塊的datanode地址的DFSInputStream隨即連接距離最近的文件中第一個塊所在的datanode。
  • 步驟4,通過對數據流反復調用read()方法,可以將數據從datanode傳輸到客戶端。
  • 步驟5,到達塊的末端時,DFSInputStream關閉與該datanode的連接,然後尋找下一個塊的最佳datanode。
  • 步驟6,客戶端從流中讀取數據時,塊是按照打開DFSInputStream與datanode新建連接的順序讀取的,它也會根據需要詢問namenode來檢索下一批數據塊的datanode位置。一旦客戶端完成讀取,就對FSDataInputStream調用close()方法。

二、寫入文件

技術分享圖片

  • 步驟1,客戶端通過對DistributedFileSystem對象調用create()函數來新建文件。
  • 步驟2,DistributedFileSystem對namenode創建一個RPC調用,在文件系統的命名空間中新建一個文件,此時該文件中還沒有相應的數據塊。namenode執行各種不同的檢查以確保這個文件不存在以及客戶端有新建文件的權限。如果這些檢查均通過,namenode就會為創建新文件記錄一條記錄
  • 步驟3,客戶端寫入數據。
  • 步驟4,在客戶端寫入數據時,DFSOutputStream將它分成一個個的數據包,並寫入內部隊列,稱為“數據隊列”(data queue)。DataStreamer處理數據隊列,它的責任是根據datanode列表來要求namenode分配適合的新塊來存儲數據復本。這一組datanode構成一個管線——我們假設復本數為3,所以管線中有3個節點。DataStreamer將數據包流式傳輸到管線中第一個datanode,該datanode存儲數據包並將它發送到管線中的第二個datanode。同樣,第二個datanode存儲該數據包並且發送給管線中的第三個(也是最後一個)datanode。
  • 步驟5,DFSOutputStream也維護著一個內部數據包隊列來等待datanode的收到確認回執,稱為“確認隊列”(ack queue)。收到管道中所有datanode確認信息後,該數據包才會從確認隊列刪除
  • 步驟6,客戶端完成數據的寫入後,對數據流調用close()方法
  • 步驟7,該操作將剩余的所有數據包寫入datanode管線,並在聯系到namenode且發送文件寫入完成信號之前,等待確認。namenode已經知道文件由哪些塊組成(通過Datastreamer請求分配數據塊),所以它在返回成功之前只需要等待數據塊進行最小量的復制。

HDFS中的數據流