本文章主題:
- 寫流程
- 讀流程
HDFS遵循一次寫入多次讀取的原則步悠,因此已經(jīng)寫入文件系統(tǒng)的文件是無法修改的,只能進行刪除瘫镇,添加鼎兽,讀取操作。
-
寫流程
- 客戶端調用DistributedFileSystem的Create()方法來創(chuàng)建一個新文件铣除,DistributedFileSystem通過RPC向NameNode申請寫入新文件谚咬;
NameNode通過對文件的權限以及文件是否已存在進行校驗,校驗通過則返回具體blockId以及DataNode列表給DistributedFileSystem通孽,并在日志文件中追加記錄序宦。否則返回失敗信息;
DistributedFileSystem返回給客戶端一個FSDataOutputStream對象,供客戶端進行寫操作互捌。FSDataOutputStream對象中封裝了一個
DFSOutputStream
對象潘明,管理著NameNode與DataNode之間的通信;客戶端調用FSDataOutputStream對象的write()方法開始寫入數(shù)據(jù)秕噪,
DFSOutputStream
對象將數(shù)據(jù)分成一個個數(shù)據(jù)包(package)并寫入“數(shù)據(jù)隊列”(data queue) 钳降;DataStreamer根據(jù)DataNode列表要求NameNode分配合適的新塊來處理數(shù)據(jù)復本;
這組DataNode組成一條管線腌巾,假如復本數(shù)為3遂填,則這條管線就擁有3個復本。-- DataStreamer將數(shù)據(jù)包流式傳輸?shù)焦芫€中的第1個DataNode中澈蝙,DataNode存儲數(shù)據(jù)并將數(shù)據(jù)包傳輸給第2個吓坚,以此類推直至傳輸?shù)焦芫€中的最后一個節(jié)點;
DFSOutputStream
同時維護著一個“確認隊列”(ack queue) 來等待DataNode存儲成功的確認回執(zhí)灯荧,數(shù)據(jù)包從最后一個節(jié)點依次往前傳遞礁击,DFSOutputStream
收到所有確認信息之后,則刪除數(shù)據(jù)包逗载;客戶端完成數(shù)據(jù)的寫入之后哆窿,調用close()方法,關閉FSDataOutputStream厉斟;
DistributedFileSystem通知NameNode文件寫入成功挚躯,NameNode同時將元數(shù)據(jù)寫入內(nèi)存;
-
寫過程故障處理:
- 關閉管線擦秽,將數(shù)據(jù)包添加回數(shù)據(jù)隊列的最前端码荔,以確保下游的DataNode不會漏掉任何一個數(shù)據(jù)包;
- 找到一個存儲著當前數(shù)據(jù)塊的DataNode(正常的)感挥,為它加上一個新的標識目胡,并且將該標識傳送給NameNode,便于在故障DataNode在恢復之后可以刪除存儲的部分數(shù)據(jù)塊链快;
- 從管線中刪除故障節(jié)點,并且將數(shù)據(jù)塊寫入另外兩個正常節(jié)點眉尸;
- 當NameNode發(fā)現(xiàn)block復本數(shù)不足的時候域蜗,會在另外一個節(jié)點上創(chuàng)建一個新復本。
-
讀流程
- 客戶端調用DistributedFileSystem的open()方法噪猾,告訴分布式文件系統(tǒng)對象(DistributedFileSystem)希望打開某個文件霉祸;
- DistributedFileSystem通過RPC來調用NameNode節(jié)點,并從中獲取block文件塊的在datanode地址袱蜡;
- DistributedFileSystem將位置信息封裝成FSDataInputStream對象返回給客戶端丝蹭,F(xiàn)SDataInputStream對象中封裝了一個
DFSInputStream
對象,它管理著DataNode與NameNode之間的I/O坪蚁; - 客戶端調用FSDataInputStream對象的read()方法奔穿,
DFSInputStream
對象隨即連接最近的DataNode镜沽,通過反復調用read()方法,將數(shù)據(jù)從DataNode傳輸給客戶端贱田; - 當客戶端將所有的數(shù)據(jù)塊讀取完成缅茉,調用FSDataInputStream的close()方法,關閉數(shù)據(jù)流男摧;
- 在讀取過程中出錯蔬墩,
DFSInputStream
會嘗試讀取臨近DataNode中的block; - 在每讀完一個block耗拓,
DFSInputStream
都會檢驗數(shù)據(jù)的完整性诀浪,如果有損壞顿肺,會試圖在從其它DataNode讀取復本之前通知NameNode。