HDFS文件讀取步驟是怎么樣的授翻?我們通過下圖中的步驟順序一步步梳理,然后再看這樣設(shè)計(jì)的好處藤为。
步驟(Java客戶端)
1. open
客戶端調(diào)用FileSystem
對象的open()
方法來打開希望讀取的文件怪与,對于HDFS來說,FileSystem
對象是DistributedFileSystem
的一個實(shí)例缅疟。
2. get block locations
DistributedFileSystem
通過使用遠(yuǎn)程過程調(diào)用(RPC)來調(diào)用namenode
分别,以確定文件起始塊的位置。對于每個塊存淫,namenode
返回存有該塊副本的datanode
地址耘斩。datanode
根據(jù)距離客戶端的距離來排序,會選擇在最近的datanode
中讀取數(shù)據(jù)桅咆。
3. read括授,read from FSDataInputStream
DistributedFileSystem
類返回一個FSDataInputStream
對象給客戶端用來讀取數(shù)據(jù),該對象支持文件定位岩饼,該對象對datanode
和namenode
的I/O進(jìn)行了封裝荚虚。客戶端對這個輸入流代用read()
方法籍茧。
4. read版述,read from first datanode
存儲著文件起始塊的datanode
地址的DFSInputStream
(3 中的FSDataInputStream
封裝了DFSInputStream
)連接距離最近的文件中的第一個塊所在的datanode
,通過read()
方法寞冯,將數(shù)據(jù)從datanode
傳輸?shù)娇蛻舳恕?/p>
5. read渴析,read from next datanode
讀取到塊的末端時,DFSInputStream
關(guān)閉與datanode
的連接简十,然后尋找下一個塊的最佳(距離最近)的datanode
檬某。對于客戶端來說,客戶端只是在讀取一個連續(xù)的流螟蝙。
6. close
客戶端讀取完成后恢恼,調(diào)用FSDataInputStream
對象的close()
方法關(guān)閉流。
設(shè)計(jì)優(yōu)勢
1. 容錯
在 4 和 5 步驟中胰默,如果DFSInputStream
與datanode
的通信失敗场斑,會嘗試從這個塊的另一個最鄰近的datanode
讀取數(shù)據(jù)。也會記住這故障的datanode
牵署,并校驗(yàn)從datanode
讀取到的數(shù)據(jù)是否完整漏隐。如有損壞的塊也會嘗試從其他datanode
讀取這個塊的副本,并將損壞的塊的情況告訴namenode
奴迅。
2. 提高客戶端并發(fā)
客戶端可以直接連接到datanode
檢索數(shù)據(jù)青责,并且namenode
告知客戶端每個塊所在的距離客戶端最近的datanode
。這樣數(shù)據(jù)流就分散在了集群中的所有的datanode
上,使HDFS可以接受大量客戶端的并發(fā)讀取請求脖隶。
3. 減輕namenode的處理壓力
這樣設(shè)計(jì)namenode
只需要響應(yīng)獲取塊位置的請求扁耐,這些信息由datanode
匯報并存在內(nèi)存中,非常高效产阱,數(shù)據(jù)響應(yīng)交給datanode
婉称,自身不需要響應(yīng)數(shù)據(jù)請求。如果不這樣做构蹬,namenode
將成為瓶頸王暗。