一、 更改目錄操作
該操作基本只和NameNode進行交互
rename/mkdir等操作
NameNode在目錄樹數(shù)據(jù)結(jié)構(gòu)上對應(yīng)位置創(chuàng)建新的目錄節(jié)點并持久化到日志中。
delete操作以及增加副本等相對復(fù)雜的操作
NameNode標(biāo)記需要刪除的文件并且持久化到日志中,等到DataNode提交心跳的時會獲取到刪除的命令,之后DataNode執(zhí)行該刪除指令,此時數(shù)據(jù)才會真正的被刪除。
二、讀取文件操作(NameNode僅提供數(shù)據(jù)塊定位請求)
Client先打開一個輸入流DFSInputStream
向NameNode獲取文件開始部分數(shù)據(jù)塊存儲的地址(返回副本所在的數(shù)據(jù)節(jié)點地址并且利用網(wǎng)絡(luò)的拓撲信息進行簡單的排序)
Client和最近的數(shù)據(jù)節(jié)點建立聯(lián)系,然后讀取該塊的信息直到塊的末端,再關(guān)閉連接
重復(fù)2,3步
讀取完畢后關(guān)閉輸入流
2,3步對Client是透明的,實際是由DFSInputStream來進行的,Client是僅跟DFSInputStream進行交互
在讀取的時候會同時獲取數(shù)據(jù)以及數(shù)據(jù)校驗和進行校驗數(shù)據(jù)的一致性,若是校驗錯誤則報告給NameNode,并嘗試從別的數(shù)據(jù)節(jié)點中讀取另外一個副本的文件內(nèi)容。讓客戶端來進行校驗可以降低數(shù)據(jù)節(jié)點的負載,均衡各節(jié)點的計算能力
如果讀取的時候數(shù)據(jù)節(jié)點發(fā)生錯誤,那么Client會嘗試讀取下一個數(shù)據(jù)塊的位置并且記住故障的數(shù)據(jù)節(jié)點并不再進行嘗試。
NameNode并不會一次性返回所有數(shù)據(jù)塊的信息,每次僅返回一組數(shù)據(jù)塊的信息
三、寫文件操作
Client打開輸出流DFSDataOutputStream
NameNode在文件系統(tǒng)的命名空間創(chuàng)建新文件(做一些檢查)并記錄到編輯日志中
DFSDataOutputStream向NameNode申請數(shù)據(jù)塊(返回數(shù)據(jù)塊標(biāo)識、版本號等信息)
與DataNode進行連接并且開始鏈式寫數(shù)據(jù)以及逆流ack操作
寫完一個數(shù)據(jù)塊就向NameNode提交數(shù)據(jù)塊;若是還有數(shù)據(jù)再繼續(xù)申請數(shù)據(jù)塊
全部寫完后Client關(guān)閉輸出流
輸出流通知NameNode關(guān)閉文件,完成一次正常的寫文件流程
若是寫的時候有數(shù)據(jù)節(jié)點故障,則
① 數(shù)據(jù)流寫通道關(guān)閉
② 已經(jīng)發(fā)送到管道卻還沒收到ack的數(shù)據(jù)會被添加到輸出隊列
(當(dāng)作沒有寫過來處理從而保證任一節(jié)點故障都不會丟數(shù)據(jù))
③ 當(dāng)前正常工作的DataNode上的數(shù)據(jù)塊(指正在寫的這個塊)會被賦予一個新的版本號并報告NameNode,故障的DataNode恢復(fù)過來的時候會因為數(shù)據(jù)塊版本號跟NameNode保存的版本號不一致而被刪除。
④ 數(shù)據(jù)流管道中刪除錯誤DataNode,重新建立管道并繼續(xù)寫數(shù)據(jù)到正常的DataNode
只要成功寫入的副本數(shù)滿足dfs.replication.min(默認1)的值,則認為寫操作是成功的。后續(xù)這個數(shù)據(jù)塊會被復(fù)制,直到滿足文件的副本系數(shù)要求。
四、數(shù)據(jù)節(jié)點啟動和心跳
DataNode先跟NameNode比對版本號,檢查它們之間的HDFS版本是 一致的
DataNode向NameNode進行注冊,NameNode會檢查該DataNode是否是該集群的成員,保證整個系統(tǒng)的一致性。
成功注冊后DataNode會將當(dāng)前管理的數(shù)據(jù)塊信息上報給NameNode,幫助NameNode建立HDFS文件數(shù)據(jù)塊到數(shù)據(jù)節(jié)點的映射關(guān)系
五、Secondarynamenode合并元數(shù)據(jù)
Client對文件系統(tǒng)的目錄樹進行修改的操作都會被NameNode記錄在編輯日志里,保證出現(xiàn)故障的時候可以快速恢復(fù)。為了避免編輯日志過大導(dǎo)致恢復(fù)時間過長,HDFS引入了檢查點機制(fsimage)
fsimage是文件系統(tǒng)元數(shù)據(jù)的持久性檢查點
NameNode與DataNode的交互
NameNode需要只需要準備一個DatanodeCommand數(shù)組,里面存放各種操作指令。在DataNode提交心跳的時候會拉取該數(shù)組回去并且執(zhí)行里面的操作指令。