今天小編給大家分享一下HDFS的讀寫流程是什么的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
1.讀文件的流程
如圖所示,讀文件的流程主要包括以下6個步驟:
- 打開分布式文件:調用分布式文件 DistributedFileSystem.open( ) 方法;
- 尋址請求:從 NameNode 處得到 DataNode 的地址,DistributedFileSystem使用 RPC 方式調用了NameNode,NameNode 返回存有該副本的DataNode 地址,DistributedFileSystem 返回了一個輸入流對象(FSDataInputStream),該對象封裝了輸入流 DFSInputStream;
- 連接到DataNode:調用輸入流 FSDataInputStream.read( ) 方法從而讓DFSInputStream 連接到 DataNodes;
- 從 DataNode 中獲取數據:通過循環調用 read( ) 方法,從而將數據從 DataNode 傳輸到客戶端;
- 讀取另外的 DataNode 直到完成:到達塊的末端時候,輸入流 DFSInputStream 關閉與 DataNode 連接, 尋找下一個 DataNode;
- 完成讀取,關閉連接:即調用輸入流 FSDataInputStream.close( );
2.寫文件流程
- 發送創建文件請求:調用分布式文件系統 DistributedFileSystem.create( )方法;
- NameNode 創建文件記錄:分布式文件系統 DistributedFileSystem 發送 RPC 請求給 NameNode,NameNode 檢查權限后創建一條記錄,返回輸出流 FSDataOutputStream,封裝了輸出流 DFSOutputDtream;
- 客戶端寫入數據:輸出流 DFSOutputDtream 將數據分成一個個的數據包,并寫入內部隊列。DataStreamer 根據 DataNode 列表來要求 NameNode 分配適合的新塊來存儲數據備份。 一組 DataNode 構成管線(管線的 DataNode 之間使用 Socket 流式通信);
- 使用管線傳輸數據:DataStreamer 將數據包流式傳輸到管線第一個DataNode,第一個 DataNode 再傳到第二個DataNode,直到完成;
- 確認隊列:DataNode 收到數據后發送確認,管線的 DataNode 所有的確認組成一個確認隊列。所有 DataNode 都確認,管線數據包刪除;
- 關閉:客戶端對數據量調用 close( ) 方法。將剩余所有數據寫入DataNode管線,聯系NameNode并且發送文件寫入完成信息之前等待確認;
- 故障處理:若過程中發生故障,則先關閉管線,把隊列中所有數據包添加回去隊列,確保數據包不漏。為另一個正常 DataNode 的當前數據塊指定一個新的標識,并將該標識傳送給 NameNode,一遍故障 DataNode 在恢復后刪除上面的不完整數據塊。從管線中刪除故障 DataNode 并把余下的數據塊寫入余下正常的 DataNode。NameNode 發現復本兩不足時,會在另一個節點創建一個新的復本;
在數據的讀取過程中難免碰到網絡故障,臟數據,DataNode 失效等問題,這些問題 HDFS 在設計的時候都早已考慮到了。下面來介紹一下數據損壞處理流程:
- 當 DataNode 讀取 block 的時候,它會計算 checksum。
- 如果計算后的 checksum,與 block 創建時值不一樣,說明該 block 已經損壞。
- Client 讀取其它 DataNode上的 block。
- NameNode 標記該塊已經損壞,然后復制 block 達到預期設置的文件備份數 。
- DataNode 在其文件創建后驗證其 checksum。
以上就是“HDFS的讀寫流程是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。