HDFS檔案的寫入和讀取過程

2021-10-02 12:08:54 字數 1968 閱讀 5880

hdfs檔案寫入

client 發起檔案上傳請求,通過 rpc 與 namenode 建立通訊namenode 檢查目標檔案是否已存在, 父目錄是否存在,返回是否可以上傳client請求上傳第乙個 block

namenode 根據配置檔案中指定的備份數量及機架感知原理進行檔案分配, 返回可用的 datanode 的位址如(預設備份數量為3)

client 請求 3 臺 datanode 中的一台 a client 請求 3 臺 datanode 中的一台 a 上傳資料(本質上是乙個rpc 呼叫,建立 pipeline), a 收到請求會繼續呼叫 b, 然後 b 呼叫 c, 將整個 pipeline 建立完成, 後逐級返回 client(本質上是乙個 rpc 呼叫,建立 pipeline ), a 收到請求會繼續呼叫 b, 然後 b 呼叫 c, 將整個 pipeline 建立完成, 後逐級返回 client

client 開始往 a上傳第乙個 block(先從磁碟讀取資料放到乙個本地記憶體快取),以 packet 為單位(預設64k), a 收到乙個 packet 就會傳給 b, b 傳給 c. a 每傳乙個 packet 會放入乙個應答佇列等待應答

資料被分割成乙個個 packet 資料報在 pipeline 上依次傳輸, 在 pipeline 反方向上, 逐個傳送 ack(命令正確應答), 最終由 pipeline 中第乙個 datanode 節點 a 將 pipelineack 傳送給 client

當乙個 block 傳輸完成之後, client 再次請求 namenode 上傳第二個 block 到伺服器

hdfs檔案讀取

client向namenode發起rpc請求,來確定請求檔案block所在的位置

namenode會視情況返回檔案的部分或者全部block列表,對於每個block,namenode 都會返回含有該 block 副本的 datanode 位址; 這些返回的 dn 位址會按照集群拓撲結構得出 datanode 與客戶端的距離進行排序,排序兩個規則:網路拓撲結構中距離 client 近的排靠前;心跳機制中超時匯報的 dn 狀態為 stale的排靠後

client 選取排序靠前的 datanode 來讀取 block,與對應的datanode建立pipeline讀取資料,

資料讀取底層上本質是建立socket stream(fsdatainputstream),重複的呼叫父類 datainputstream 的 read 方法,直到這個塊上的資料讀取完畢,當讀完列表的 block 後,若檔案讀取還沒有結束,客戶端會繼續向namenode 獲取下一批的 block 列表(讀取完乙個 block 都會進行checksum 驗證,如果讀取 datanode 時出現錯誤,客戶端會通知 namenode,然後再從下乙個擁有該 block 副本的datanode 繼續讀。)。資料讀取的單位是packet(64k),read 方法是並行的讀取block 資訊,不是一塊一塊的讀取;namenode 只是返回client請求包含塊的datanode位址,並不是返回請求塊的資料

最終讀取來所有的 block 會合併成乙個完整的最終檔案

hdfs的寫入過程和讀取過程

1 客戶端 client 發出請求 將請求發給namenode 要將大小為300m的a.txt檔案上傳到 根目錄下 a.txt 2 namenode對收到的請求做出檢測 檢測1 所上傳的路徑下是否存在該檔案,即根目錄下是否有a.txt 檢測2 檢測客戶端是否有上傳許可權 3 檢測通過,反饋給客戶端 ...

hdfs檔案寫入與讀取過程

client向namenode請求上傳a.txt namenode檢測client的上傳許可權 namenode回答client是否可以上傳 client將檔案按照block size大小將檔案分為幾份,並向namenode請求上傳乙個block namenode根據datanode上的block資...

HDFS檔案讀取和寫入

讀取檔案 一 讀取方式一 寫入哪個datanode是不確定的,主要尋找讀取速度較快的datanode 怎麼找到這種datanode,從以下幾個方面 是否有本機位置,本機架位置,本機房位置 依次重試讀取檔案,直到讀取檔案成功 二 讀取方式二 backupread 每次讀取時,client會並行試著讀取...