HDFS 讀寫流程


 讀文件的過程

客戶端(client)用FileSystem的open()函數打開文件

DistributedFileSystem用RPC調用元數據節點,得到文件的數據塊信息。

對於每一個數據塊,元數據節點返回保存數據塊的數據節點的地址。

DistributedFileSystem返回FSDataInputStream給客戶端,用來讀取數據。

客戶端調用stream的read()函數開始讀取數據。

DFSInputStream連接保存此文件第一個數據塊的最近的數據節點。

Data從數據節點讀到客戶端(client)

當此數據塊讀取完畢時,DFSInputStream關閉和此數據節點的連接,然后連接此文件下一個數據塊的最近的數據節點。

當客戶端讀取完畢數據的時候,調用FSDataInputStream的close函數。

在讀取數據的過程中,如果客戶端在與數據節點通信出現錯誤,則嘗試連接包含此數據塊的下一個數據節點。

失敗的數據節點將被記錄,以后不再連接。

 

寫文件的過程

客戶端調用create()來創建文件

DistributedFileSystem用RPC調用元數據節點,在文件系統的命名空間中創建一個新的文件。

元數據節點首先確定文件原來不存在,並且客戶端有創建文件的權限,然后創建新文件。

DistributedFileSystem返回DFSOutputStream,客戶端用於寫數據。

客戶端開始寫入數據,DFSOutputStream將數據分成塊,寫入data queue。

Data queue由Data Streamer讀取,並通知元數據節點分配數據節點,用來存儲數據塊(每塊默認復制3塊)。分配的數據節點放在一個pipeline里。

Data Streamer將數據塊寫入pipeline中的第一個數據節點。第一個數據節點將數據塊發送給第二個數據節點。第二個數據節點將數據發送給第三個數據節點。

DFSOutputStream為發出去的數據塊保存了ack queue,等待pipeline中的數據節點告知數據已經寫入成功。

如果數據節點在寫入的過程中失敗:

關閉pipeline,將ack queue中的數據塊放入data queue的開始。

當前的數據塊在已經寫入的數據節點中被元數據節點賦予新的標示,則錯誤節點重啟后能夠察覺其數據塊是過時的,會被刪除。

失敗的數據節點從pipeline中移除,另外的數據塊則寫入pipeline中的另外兩個數據節點。

元數據節點則被通知此數據塊是復制塊數不足,將來會再創建第三份備份。

當客戶端結束寫入數據,則調用stream的close函數。此操作將所有的數據塊寫入pipeline中的數據節點,並等待ack queue返回成功。最后通知元數據節點寫入完畢。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM