使用hdfs的客戶端,向遠端的namenode發起rpc請求
namenode會據情況返回部分或者全部的block列表,對於每個block塊,namenode都會返回有該block塊拷貝的datanode位址
客戶端client會選取離客戶端最近的datanode來讀取block,如果客戶端本身就是datanode,那直接從本地讀取
當讀完列表block後,且檔案讀取還沒有結束,客戶端會繼續向namenode獲取下一批的block列表
讀取完乙個block都會進行checksum驗證,如果讀取datanode時出現錯誤,客戶端會通知namenode,然後再從下乙個擁有該block拷貝的datanode繼續讀。
客戶端及讀取hdfs中的資料的流程圖,如下圖所示:
使用hdfs提供的客戶端client,向遠端的namenode發起rpc請求
namenode會檢查要建立的檔案是否已經存在,建立者是否有許可權進行操作,成功則會為檔案建立乙個記錄,否則會讓客戶端丟擲異常;
當客戶端開始寫入檔案的時候,客戶端會將檔案切分成多個packets,並在內部以資料佇列「data queue(資料佇列)」的形式管理這些packets,並向namenode申請blocks,獲取用來儲存replicas的合適的datanode列表,列表的大小根據namenode中replication的設定而定;
開始以pipeline(管道)的形式將packet寫入所有的replicas中。開發庫把packet以流的方式寫入第乙個datanode,該datanode把該packet儲存之後,再將其傳遞給在此pipeline中的下乙個datanode,直到最後乙個datanode,這種寫資料的方式呈流水線的形式。
最後乙個datanode成功儲存之後會返回乙個ack packet(確認佇列),在pipeline裡傳遞至客戶端,在客戶端的開發庫內部維護著"ack queue",成功收到datanode返回的ack packet後會從"ack queue"移除相應的packet。
如果傳輸過程中,有某個datanode出現了故障,那麼當前的pipeline會被關閉,出現故障的datanode會從當前的pipeline中移除,剩餘的block會繼續剩下的datanode中繼續以pipeline的形式傳輸,同時namenode會分配乙個新的datanode,保持replicas設定的數量。
客戶端完成資料的寫入後,會對資料流呼叫close()方法,關閉資料流;
只要寫入了dfs.replication.min的複本數(預設為1),寫操作就會成功,並且這個塊可以在集群中非同步複製,直到達到其目標複本數(dfs.replication的預設值為3),因為namenode已經知道檔案由哪些塊組成,所以它在返回成功前只需要等待資料塊進行最小量的複製。
客戶端將資料寫入hdfs的流程圖,如下圖所示:
HDFS讀寫檔案
hdfs讀寫檔案 hdfs讀檔案 首先,由client下達命令交給distributed file system系統翻譯成linux命令,然後把命令傳送給namenode,namenode去搜尋fsimage和edit logs,搜到以後把檔案的塊位址 get block locations 返回給...
hdfs讀寫流程 HDFS 檔案讀寫流程
開啟分布式檔案 呼叫分布式檔案 distributedfilesystem.open 方法 定址請求 從 namenode 處得到 datanode 的位址,distributedfilesystem使用 rpc 方式呼叫了namenode,namenode 返回存有該副本的datanode 位址,...
關於HDFS的讀寫流程
今天主要是和大家分享一下有關hdfs的讀寫流程,有關hadoop和其他相關的基礎我會在之後的大資料只是總結中一一的總結出來,有興趣的小夥伴可以關注我之後的更新 進入正題首先先由我這位靈魂畫手給大家上一張圖 首先先來說一下各自的功能 namenode 負責管理整個檔案系統的元資料,以及所對應資料塊的資...