1. 程式人生 > >HDFS的讀寫操作

HDFS的讀寫操作

在HDFS讀操作

資料讀取請求將由 HDFS,NameNode和DataNode來服務。讓我們把讀取器叫 “客戶”。下圖描繪了檔案的讀取操作在 Hadoop 中。

  1. 客戶端啟動通過呼叫檔案系統物件的 open() 方法讀取請求; 它是 DistributedFileSystem 型別的物件。
  2. 此物件使用 RPC 連線到 namenode 並獲取的元資料資訊,如該檔案的塊的位置。 請注意,這些地址是檔案的前幾個塊。
  3. 響應該元資料請求,具有該塊副本的 DataNodes 地址被返回。
  4. 一旦接收到 DataNodes 的地址,FSDataInputStream 型別的一個物件被返回到客戶端。 FSDataInputStream 包含 DFSInputStream 這需要處理互動 DataNode 和 NameNode。在上圖所示的步驟4,客戶端呼叫 read() 方法,這將導致 DFSInputStream 建立與第一個 DataNode 檔案的第一個塊連線。

  5. 以資料流的形式讀取資料,其中客戶端多次呼叫 “read() ” 方法。 read() 操作這個過程一直持續,直到它到達塊結束位置。

  6. 一旦到模組的結尾,DFSInputStream 關閉連線,移動定位到下一個 DataNode 的下一個塊
  7. 一旦客戶端已讀取完成後,它會呼叫 close()方法。

HDFS寫操作

在本節中,我們將瞭解如何通過的檔案將資料寫入到 HDFS。

  1. 客戶端通過呼叫 DistributedFileSystem物件的 create() 方法建立一個新的檔案,並開始寫操作 - 在上面的圖中的步驟1
  2. DistributedFileSystem物件使用 RPC 呼叫連線到 NameNode,並啟動新的檔案建立。但是,此檔案建立操作不與檔案任何塊相關聯。NameNode 的責任是驗證檔案(其正被建立的)不存在,並且客戶端具有正確許可權來建立新檔案。如果檔案已經存在,或者客戶端不具有足夠的許可權來建立一個新的檔案,則丟擲 IOException 到客戶端。否則操作成功,並且該檔案新的記錄是由 NameNode 建立。
  3. 一旦 NameNode 建立一條新的記錄,返回FSDataOutputStream 型別的一個物件到客戶端。客戶端使用它來寫入資料到 HDFS。資料寫入方法被呼叫(圖中的步驟3)。
  4. FSDataOutputStream包含DFSOutputStream物件,它使用 DataNodes 和 NameNode 通訊後查詢。當客戶機繼續寫入資料,DFSOutputStream 繼續建立這個資料包。這些資料包連線排隊到一個佇列被稱為 DataQueue
  5. 還有一個名為 DataStreamer 元件,用於消耗DataQueue。DataStreamer 也要求 NameNode 分配新的塊,揀選 DataNodes 用於複製。
  6. 現在,複製過程始於使用 DataNodes 建立一個管道。 在我們的例子中,選擇了複製水平3,因此有 3 個 DataNodes 管道。
  7. 所述 DataStreamer 注入包分成到第一個 DataNode 的管道中。
  8. 在每個 DataNode 的管道中儲存資料包接收並同樣轉發在第二個 DataNode 的管道中。
  9. 另一個佇列,“Ack Queue”是由 DFSOutputStream 保持儲存,它們是 DataNodes 等待確認的資料包。
  10. 一旦確認在佇列中的分組從所有 DataNodes 已接收在管道,它從 'Ack Queue' 刪除。在任何 DataNode 發生故障時,從佇列中的包重新用於操作。
  11. 在客戶端的資料寫入完成後,它會呼叫close()方法(第9步圖中),呼叫close()結果進入到清理快取剩餘資料包到管道之後等待確認。
  12. 一旦收到最終確認,NameNode 連線告訴它該檔案的寫操作完成。