HDFS(六)—— HDFS 檔案下載的過程
阿新 • • 發佈:2018-11-25
一、客戶端發出下載檔案的請求
客戶端執行hdfs dfs -get /movie/a.avi
命令請求 HDFS 下載檔案到本地。
二、DFSClient 接收請求,建立 DistributedFileSystem 物件
DFSClient 接收下載檔案的請求,並且建立 DistributedFileSystem 物件。
三、DistributedFileSystem 建立與 NameNode 的 RPC 通訊,得到 NameNodeProxies
DistributedFileSystem 建立與 NameNode 的 RPC 通訊,並且得到 NameNode 的代理物件 NameNodeProxies。
四、DistributedFileSystem 通過代理物件獲取檔案的元資訊
DistributedFileSystem 通過代理物件去 HDFS 上查詢檔案的元資訊。
五、在記憶體中查詢檔案的元資訊
資料的元資訊是優先儲存在記憶體中的,所以 NameNode 會優先去記憶體中查詢。
為了保證元資訊的查詢速率,通常我們會使用 NameNode 的聯盟對記憶體容量進行擴充套件。
六、在 fsimage 檔案中查詢檔案的元資訊
如果在記憶體中找到了元資訊,就直接返回,在記憶體中沒有找到就會去 fsimage 檔案中查詢。
七、返回檔案的元資訊
NameNode 將找到的元資訊返給 DFSClient。
八、建立輸入流 FSDataInputStream
DFSClient 建立 FSDataInputStream 物件建立與 HDFS 的 IO 流。
// 開啟一個輸入流 <------HDFS
InputStream in = client.open(new Path("/tools/stt.txt"));
九、下載資料塊
通過 IO 流迴圈去 DataNode 下載資料。
HDFS 會維護一個 DataNode 的失敗列表,記錄哪些 DataNode 壞掉了,客戶端在訪問資料的時候就不會去這些 DataNode 上訪問。