1)客戶端經過Distributed FileSystem模塊向namenode請求上傳文件,namenode檢查目標文件是否已存在,父目錄是否存在。node
2)namenode返回是否能夠上傳。緩存
3)客戶端請求第一個 block上傳到哪幾個datanode服務器上。服務器
4)namenode返回3個datanode節點,分別爲dn一、dn二、dn3。oop
5)客戶端經過FSDataOutputStream模塊請求dn1上傳數據,dn1收到請求會繼續調用dn2,而後dn2調用dn3,將這個通訊管道創建完成。設計
6)dn一、dn二、dn3逐級應答客戶端。3d
7)客戶端開始往dn1上傳第一個block(先從磁盤讀取數據放到一個本地內存緩存,而後纔會寫入本地磁盤),以packet爲單位,dn1收到一個packet就會傳給dn2,dn2傳給dn3;dn1每傳一個packet會放入一個應答隊列等待應答。日誌
8)當一個block傳輸完成以後,客戶端再次請求namenode上傳第二個block的服務器。(重複執行3-7步)blog
1.請求namenode 由於namenode元數據裏面記錄了DataNode的地址隊列
2.把咱們的信息返回給客戶端內存
3.客戶端收到信息以後 就到相應客戶端去請求數據便可
4.重點是請求那個DataNode上的哪一個塊信息,由於namenode上存放的是塊編號
元數據保存在內存中,fsimage是元數據文件的存放方式,fsimage中的內容是各個文件的塊信息
namenode中fsimage信息會每隔半小時更新一次,新文件與舊文件合併不斷更新,在關閉時也會更新一次,開啓時namenode會吧fsimage的數據加載到內存
在無Secondarynamenode時namenode要處理大量的客戶端的請求還要每半小時把內存的數據同步到fsimage一次,爲了減少namenode工做負擔,設計出secondarynamenode。
secondarynamenode是對namenode的一個備份,它會下載namenode上的日誌信息,根據日誌生成fsimage實現對namenode的備份,把fsimage傳給namenode,這時同步的任務交給secondarynamenode,namenode無需本身每半小時同步到fsimage。
不開啓secondarynamenode的狀況下,若是namenode掛掉就沒法恢復。
1.secondary namenode請求主Namenode中止使用edits文件,暫時將新的寫操做記錄到一個新文件中,如edits.new。
2.secondary namenode節點從主Namenode節點獲取fsimage和edits文件(採用HTTP GET)
3.secondary namenode將fsimage文件載入到內存,逐一執行edits文件中的操做,建立新的fsimage文件
4.secondary namenode將新的fsimage文件發送回主Namenode(使用HTTP POST)
5.主Namenode節點將從secondary namenode節點接收的fsimage文件替換舊的fsimage文件,用步驟1產生的edits.new文件替換舊的edits文件(即更名)。同時更新fstime文件來記錄檢查點執行的時間
注:從Hadoop0.21.0開始,輔助Namenode已經放棄不用,由checkpoint節點取而代之,功能不變。新版本同時引入一種新的Namenode,名爲BackupNode