HDFS的讀寫操作
阿新 • • 發佈:2018-12-03
在HDFS讀操作
資料讀取請求將由 HDFS,NameNode和DataNode來服務。讓我們把讀取器叫 “客戶”。下圖描繪了檔案的讀取操作在 Hadoop 中。
- 客戶端啟動通過呼叫檔案系統物件的 open() 方法讀取請求; 它是 DistributedFileSystem 型別的物件。
- 此物件使用 RPC 連線到 namenode 並獲取的元資料資訊,如該檔案的塊的位置。 請注意,這些地址是檔案的前幾個塊。
- 響應該元資料請求,具有該塊副本的 DataNodes 地址被返回。
-
一旦接收到 DataNodes 的地址,FSDataInputStream 型別的一個物件被返回到客戶端。 FSDataInputStream 包含 DFSInputStream 這需要處理互動 DataNode 和 NameNode。在上圖所示的步驟4,客戶端呼叫 read() 方法,這將導致 DFSInputStream 建立與第一個 DataNode 檔案的第一個塊連線。
-
以資料流的形式讀取資料,其中客戶端多次呼叫 “read() ” 方法。 read() 操作這個過程一直持續,直到它到達塊結束位置。
- 一旦到模組的結尾,DFSInputStream 關閉連線,移動定位到下一個 DataNode 的下一個塊
- 一旦客戶端已讀取完成後,它會呼叫 close()方法。
HDFS寫操作
在本節中,我們將瞭解如何通過的檔案將資料寫入到 HDFS。
- 客戶端通過呼叫 DistributedFileSystem物件的 create() 方法建立一個新的檔案,並開始寫操作 - 在上面的圖中的步驟1
- DistributedFileSystem物件使用 RPC 呼叫連線到 NameNode,並啟動新的檔案建立。但是,此檔案建立操作不與檔案任何塊相關聯。NameNode 的責任是驗證檔案(其正被建立的)不存在,並且客戶端具有正確許可權來建立新檔案。如果檔案已經存在,或者客戶端不具有足夠的許可權來建立一個新的檔案,則丟擲 IOException 到客戶端。否則操作成功,並且該檔案新的記錄是由 NameNode 建立。
- 一旦 NameNode 建立一條新的記錄,返回FSDataOutputStream 型別的一個物件到客戶端。客戶端使用它來寫入資料到 HDFS。資料寫入方法被呼叫(圖中的步驟3)。
- FSDataOutputStream包含DFSOutputStream物件,它使用 DataNodes 和 NameNode 通訊後查詢。當客戶機繼續寫入資料,DFSOutputStream 繼續建立這個資料包。這些資料包連線排隊到一個佇列被稱為 DataQueue
- 還有一個名為 DataStreamer 元件,用於消耗DataQueue。DataStreamer 也要求 NameNode 分配新的塊,揀選 DataNodes 用於複製。
- 現在,複製過程始於使用 DataNodes 建立一個管道。 在我們的例子中,選擇了複製水平3,因此有 3 個 DataNodes 管道。
- 所述 DataStreamer 注入包分成到第一個 DataNode 的管道中。
- 在每個 DataNode 的管道中儲存資料包接收並同樣轉發在第二個 DataNode 的管道中。
- 另一個佇列,“Ack Queue”是由 DFSOutputStream 保持儲存,它們是 DataNodes 等待確認的資料包。
- 一旦確認在佇列中的分組從所有 DataNodes 已接收在管道,它從 'Ack Queue' 刪除。在任何 DataNode 發生故障時,從佇列中的包重新用於操作。
- 在客戶端的資料寫入完成後,它會呼叫close()方法(第9步圖中),呼叫close()結果進入到清理快取剩餘資料包到管道之後等待確認。
- 一旦收到最終確認,NameNode 連線告訴它該檔案的寫操作完成。