HDFS-文件讀寫流程
05-09
上一篇我們詳細地介紹了 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並且發送文件寫入完成信息之前等待確認;
- NameNode確認:
- 故障處理:若過程中發生故障,則先關閉管線,把隊列中所有數據包添加回去隊列,確保數據包不漏。為另一個正常 DataNode 的當前數據塊指定一個新的標識,並將該標識傳送給 NameNode,一遍故障 DataNode 在恢復後刪除上面的不完整數據塊。從管線中刪除故障 DataNode 並把餘下的數據塊寫入餘下正常的 DataNode。NameNode 發現複本兩不足時,會在另一個節點創建一個新的複本;
在數據的讀取過程中難免碰到網路故障,臟數據,DataNode 失效等問題,這些問題 HDFS 在設計的時候都早已考慮到了。下面來介紹一下數據損壞處理流程:
- 當 DataNode 讀取 block 的時候,它會計算 checksum。
- 如果計算後的 checksum,與 block 創建時值不一樣,說明該 block 已經損壞。
- Client 讀取其它 DataNode上的 block。
- NameNode 標記該塊已經損壞,然後複製 block 達到預期設置的文件備份數 。
- DataNode 在其文件創建後驗證其 checksum。
理解HDFS架構優缺點
HDFS優點:
- 數據冗餘,硬體容錯
- 處理流式的數據訪問(一次寫入,多次讀取的操作)
- 適合存儲大文件
- 可構建在廉價的機器上
缺點:
- 不適合低延遲的數據訪問
- 不適合小文件的存儲
- 不支持多用戶寫入及任意修改文件
如果覺得文章不錯,歡迎轉發點贊,另外有錯誤歡迎留言指出,謝謝。
歡迎關注我的公眾號:Jianpan
更多好文,敬請期待!
推薦閱讀:
※數據、資料庫、數據倉庫
※定位未來的自己—數據分析學習計劃
※信數據,得永生(一:數據主義簡介)
※大數據的價值,在「用」不在「大」
※未來營銷的闖關高配:大數據+虛擬現實+人工智慧