Hadoop將底層文件系統(tǒng)抽象成FileSystem類盾剩,上層用戶可以通過相同方法操作底層不同的文件系統(tǒng)替蔬。常用的方法有g(shù)et一個(gè)FileSystem實(shí)例,open打開一個(gè)文件的輸入流驻粟,然后通過輸入流的read方法讀取數(shù)據(jù)凶异。下面簡(jiǎn)單地將這三個(gè)方法時(shí)序流程中主要環(huán)節(jié)以時(shí)序圖形式表示(以文件系統(tǒng)為HDFS為例)挤巡,以便讀者有所了解酷麦。
- get方法獲得FileSystem實(shí)例
FileSystem抽象類通過讀取配置文件"core-site.xml"中屬性"fs.default.name"的值沃饶,判斷使用哪個(gè)文件系統(tǒng),然后通過反射生成文件系統(tǒng)實(shí)例绍坝,后調(diào)用DistributedFileSystem(FileSystem的繼承實(shí)現(xiàn)類)的initialize方法獲取NameNode的代理客戶端類苔悦。
- open方法打開輸入流
通過get獲得的NameNode代理客戶端類使用RPC技術(shù)從NameNode得到文件所有塊的位置玖详。
NameNode返回塊的位置數(shù)據(jù)格式如下所示:其中有文件大小,塊是否損壞拗踢,每一個(gè)塊所在的所有DataNode的位置向臀,以及最后一個(gè)塊的信息。
其中192.168.124.129為NameNode主機(jī)IP君纫,192.168.124.130和192.168.124.131為DataNode主機(jī)IP.LocatedBlocks{
fileLength=3
underConstruction=false
blocks=[LocatedBlock{BP-891302631-192.168.124.129- 1504501047605:blk_1073741827_1003; getBlockSize()=3; corrupt=false; offset=0; locs=[DatanodeInfoWithStorage[192.168.124.130:50010,DS-32818ad7-b98d-4b43-a43d-669972cb5df7,DISK], DatanodeInfoWithStorage[192.168.124.131:50010,DS-338b6d03-c41b-4129-bffe-aa61c61ef975,DISK]]}]
lastLocatedBlock=LocatedBlock{BP-891302631-192.168.124.129-1504501047605:blk_1073741827_1003; getBlockSize()=3; corrupt=false; offset=0; locs=[DatanodeInfoWithStorage[192.168.124.130:50010,DS-32818ad7-b98d-4b43-a43d-669972cb5df7,DISK], DatanodeInfoWithStorage[192.168.124.131:50010,DS-338b6d03-c41b-4129-bffe-aa61c61ef975,DISK]]}
isLastBlockComplete=true}
- read方法讀取數(shù)據(jù)
open得到的輸入流對(duì)象是HdfsDatainputStream,HdfsDataInputStream輸入流繼承自FSDataInputStream,所以實(shí)際調(diào)用的是父類的read方法蓄髓,F(xiàn)SDataInputStream中封裝了DFSInputStream舒帮,所以又調(diào)用DFSInputStream的read方法,DFSInputStream中封閉了DFSClient(這是一個(gè)代理客戶端類)玩郊。通過DFSClient使用open得到的塊信息與DataNode溝通译红,得到塊的數(shù)據(jù)。