Hadoop之HDFS原理與操做

HDFS原理

HDFSHadoop Distributed File System)是一個分佈式文件系統,是谷歌的GFS山寨版本。它具備高容錯性並提供了高吞吐量的數據訪問,很是適合大規模數據集上的應用,它提供了一個高度容錯性和高吞吐量的海量數據存儲解決方案。 node

l高吞吐量訪問:HDFS的每一個Block分佈在不一樣的Rack上,在用戶訪問時,HDFS會計算使用最近和訪問量最小的服務器給用戶提供。因爲Block在不一樣的Rack上都有備份,因此再也不是單數據訪問,因此速度和效率是很是快的。另外HDFS能夠並行從服務器集羣中讀寫,增長了文件讀寫的訪問帶寬。 服務器

l高容錯性:系統故障是不可避免的,如何作到故障以後的數據恢復和容錯處理是相當重要的。HDFS經過多方面保證數據的可靠性,多份複製而且分佈到物理位置的不一樣服務器上,數據校驗功能、後臺的連續自檢數據一致性功能都爲高容錯提供了可能。 架構

l線性擴展:由於HDFSBlock信息存放到NameNode上,文件的Block分佈到DataNode上,當擴充的時候僅僅添加DataNode數量,系統能夠在不中止服務的狀況下作擴充,不須要人工干預。 分佈式

HDFS架構

clip_image001[6]

如上圖所示HDFSMasterSlave的結構,分爲NameNodeSecondary NameNodeDataNode三種角色。 oop

lNameNode:在Hadoop1.X中只有一個Master節點,管理HDFS的名稱空間和數據塊映射信息、配置副本策略和處理客戶端請求; spa

lSecondary NameNode:輔助NameNode,分擔NameNode工做,按期合併fsimagefsedits並推送給NameNode,緊急狀況下可輔助恢復NameNode 對象

lDataNodeSlave節點,實際存儲數據、執行數據塊的讀寫並彙報存儲信息給NameNode blog

HDFS 讀操做

clip_image003[6]

1.     客戶端經過調用FileSystem對象的open()方法來打開但願讀取的文件,對於HDFS來講,這個對象時分佈文件系統的一個實例; 排序

2.     DistributedFileSystem經過使用RPC來調用NameNode以肯定文件起始塊的位置,同一Block按照重複數會返回多個位置,這些位置按照Hadoop集羣拓撲結構排序,距離客戶端近的排在前面; 隊列

3.     前兩步會返回一個FSDataInputStream對象,該對象會被封裝成DFSInputStream對象,DFSInputStream能夠方便的管理datanodenamenode數據流,客戶端對這個輸入流調用read()方法;

4.     存儲着文件起始塊的DataNode地址的DFSInputStream隨即鏈接距離最近的DataNode,經過對數據流反覆調用read()方法,能夠將數據從DataNode傳輸到客戶端;

5.     到達塊的末端時,DFSInputStream會關閉與該DataNode的鏈接,而後尋找下一個塊的最佳DataNode,這些操做對客戶端來講是透明的,客戶端的角度看來只是讀一個持續不斷的流;

6.     一旦客戶端完成讀取,就對FSDataInputStream調用close()方法關閉文件讀取。

HDFS寫操做

 

clip_image005[6]

1.     客戶端經過調用DistributedFileSystemcreate()方法建立新文件;

2.     DistributedFileSystem經過RPC調用NameNode去建立一個沒有Blocks關聯的新文件,建立前NameNode會作各類校驗,好比文件是否存在、客戶端有無權限去建立等。若是校驗經過,NameNode會爲建立新文件記錄一條記錄,不然就會拋出IO異常;

3.     前兩步結束後會返回FSDataOutputStream的對象,和讀文件的時候類似,FSDataOutputStream被封裝成DFSOutputStreamDFSOutputStream能夠協調NameNodeDatanode。客戶端開始寫數據到DFSOutputStreamDFSOutputStream會把數據切成一個個小的數據包,並寫入內部隊列稱爲「數據隊列」(Data Queue)

4.     DataStreamer會去處理接受Data Queue,它先問詢NameNode這個新的Block最適合存儲的在哪幾個DataNode裏,好比重複數是3,那麼就找到3個最適合的DataNode,把他們排成一個pipeline.DataStreamerPacket按隊列輸出到管道的第一個Datanode中,第一個DataNode又把Packet輸出到第二個DataNode中,以此類推;

5.     DFSOutputStream還有一個對列叫Ack Quene,也是有Packet組成,等待DataNode的收到響應,當Pipeline中的全部DataNode都表示已經收到的時候,這時Akc Quene纔會把對應的Packet包移除掉;

6.     客戶端完成寫數據後調用close()方法關閉寫入流;

7.     DataStreamer把剩餘的包都刷到Pipeline裏而後等待Ack信息,收到最後一個Ack後,通知NameNode把文件標示爲已完成。

相關文章
相關標籤/搜索