HDFS(Hadoop Distributed File System)是一個分佈式文件系統,是谷歌的GFS山寨版本。它具備高容錯性並提供了高吞吐量的數據訪問,很是適合大規模數據集上的應用,它提供了一個高度容錯性和高吞吐量的海量數據存儲解決方案。 node
l高吞吐量訪問:HDFS的每一個Block分佈在不一樣的Rack上,在用戶訪問時,HDFS會計算使用最近和訪問量最小的服務器給用戶提供。因爲Block在不一樣的Rack上都有備份,因此再也不是單數據訪問,因此速度和效率是很是快的。另外HDFS能夠並行從服務器集羣中讀寫,增長了文件讀寫的訪問帶寬。 服務器
l高容錯性:系統故障是不可避免的,如何作到故障以後的數據恢復和容錯處理是相當重要的。HDFS經過多方面保證數據的可靠性,多份複製而且分佈到物理位置的不一樣服務器上,數據校驗功能、後臺的連續自檢數據一致性功能都爲高容錯提供了可能。 架構
l線性擴展:由於HDFS的Block信息存放到NameNode上,文件的Block分佈到DataNode上,當擴充的時候僅僅添加DataNode數量,系統能夠在不中止服務的狀況下作擴充,不須要人工干預。 分佈式
如上圖所示HDFS是Master和Slave的結構,分爲NameNode、Secondary NameNode和DataNode三種角色。 oop
lNameNode:在Hadoop1.X中只有一個Master節點,管理HDFS的名稱空間和數據塊映射信息、配置副本策略和處理客戶端請求; spa
lSecondary NameNode:輔助NameNode,分擔NameNode工做,按期合併fsimage和fsedits並推送給NameNode,緊急狀況下可輔助恢復NameNode; 對象
lDataNode:Slave節點,實際存儲數據、執行數據塊的讀寫並彙報存儲信息給NameNode; blog
HDFS 讀操做1. 客戶端經過調用FileSystem對象的open()方法來打開但願讀取的文件,對於HDFS來講,這個對象時分佈文件系統的一個實例; 排序
2. DistributedFileSystem經過使用RPC來調用NameNode以肯定文件起始塊的位置,同一Block按照重複數會返回多個位置,這些位置按照Hadoop集羣拓撲結構排序,距離客戶端近的排在前面; 隊列
3. 前兩步會返回一個FSDataInputStream對象,該對象會被封裝成DFSInputStream對象,DFSInputStream能夠方便的管理datanode和namenode數據流,客戶端對這個輸入流調用read()方法;
4. 存儲着文件起始塊的DataNode地址的DFSInputStream隨即鏈接距離最近的DataNode,經過對數據流反覆調用read()方法,能夠將數據從DataNode傳輸到客戶端;
5. 到達塊的末端時,DFSInputStream會關閉與該DataNode的鏈接,而後尋找下一個塊的最佳DataNode,這些操做對客戶端來講是透明的,客戶端的角度看來只是讀一個持續不斷的流;
6. 一旦客戶端完成讀取,就對FSDataInputStream調用close()方法關閉文件讀取。
1. 客戶端經過調用DistributedFileSystem的create()方法建立新文件;
2. DistributedFileSystem經過RPC調用NameNode去建立一個沒有Blocks關聯的新文件,建立前NameNode會作各類校驗,好比文件是否存在、客戶端有無權限去建立等。若是校驗經過,NameNode會爲建立新文件記錄一條記錄,不然就會拋出IO異常;
3. 前兩步結束後會返回FSDataOutputStream的對象,和讀文件的時候類似,FSDataOutputStream被封裝成DFSOutputStream,DFSOutputStream能夠協調NameNode和Datanode。客戶端開始寫數據到DFSOutputStream,DFSOutputStream會把數據切成一個個小的數據包,並寫入內部隊列稱爲「數據隊列」(Data Queue);
4. DataStreamer會去處理接受Data Queue,它先問詢NameNode這個新的Block最適合存儲的在哪幾個DataNode裏,好比重複數是3,那麼就找到3個最適合的DataNode,把他們排成一個pipeline.DataStreamer把Packet按隊列輸出到管道的第一個Datanode中,第一個DataNode又把Packet輸出到第二個DataNode中,以此類推;
5. DFSOutputStream還有一個對列叫Ack Quene,也是有Packet組成,等待DataNode的收到響應,當Pipeline中的全部DataNode都表示已經收到的時候,這時Akc Quene纔會把對應的Packet包移除掉;
6. 客戶端完成寫數據後調用close()方法關閉寫入流;
7. DataStreamer把剩餘的包都刷到Pipeline裏而後等待Ack信息,收到最後一個Ack後,通知NameNode把文件標示爲已完成。