HDFS介紹前端
HDFS(Hadoop Distributed File System )Hadoop分佈式文件系統。是根據google發表的論文翻版的。node
什麼是分佈式文件系統數據庫
分佈式文件系統(Distributed File System)是指文件系統管理的物理存儲資源不必定直接鏈接在本地節點上,而是經過計算機網絡與節點相連。分佈式文件系統的設計基於客戶機/服務器模式。服務器
[優勢]網絡
支持超大文件 超大文件在這裏指的是幾百M,幾百GB,甚至幾TB大小的文件。socket
檢測和快速應對硬件故障在集羣的環境中,硬件故障是常見的問題。由於有上千臺服務器鏈接在一塊兒,這樣會致使高故障率。所以故障檢測和自動恢復是hdfs文件系統的一個設計目標分佈式
流式數據訪問應用程序能以流的形式訪問數據集。主要的是數據的吞吐量,而不是訪問速度。oop
簡化的一致性模型 大部分hdfs操做文件時,須要一次寫入,屢次讀取。在hdfs中,一個文件一旦通過建立、寫入、關閉後,通常就不須要修改了。這樣簡單的一致性模型,有利於提升吞吐量。性能
[缺點]優化
低延遲數據訪問如和用戶進行交互的應用,須要數據在毫秒或秒的範圍內獲得響應。因爲hadoop針對高數據吞吐量作了優化,犧牲了獲取數據的延遲,因此對於低延遲來講,不適合用hadoop來作。
大量的小文件Hdfs支持超大的文件,是經過數據分佈在數據節點,數據的元數據保存在名字節點上。名字節點的內存大小,決定了hdfs文件系統可保存的文件數量。雖然如今的系統內存都比較大,但大量的小文件仍是會影響名字節點的性能。
多用戶寫入文件、修改文件Hdfs的文件只能有一次寫入,不支持寫入,也不支持修改。只有這樣數據的吞吐量才能大。
不支持超強的事務沒有像關係型數據庫那樣,對事務有強有力的支持。
[HDFS結構]
NameNode:分佈式文件系統中的管理者,主要負責管理文件系統的命名空間、集羣配置信息和存儲塊的複製等。NameNode會將文件系統的Meta-data存儲在內存中,這些信息主要包括了文件信息、每個文件對應的文件塊的信息和每個文件塊在DataNode的信息等。
SecondaryNameNode:合併fsimage和fsedits而後再發給namenode。
DataNode:是文件存儲的基本單元,它將Block存儲在本地文件系統中,保存了Block的Meta-data同時週期性地將全部存在的Block信息發送給NameNode。
Client:就是須要獲取分佈式文件系統文件的應用程序。
fsimage:元數據鏡像文件(文件系統的目錄樹。)
edits:元數據的操做日誌(針對文件系統作的修改操做記錄)
NameNode、DataNode和Client之間通訊方式:
client和namenode之間是經過rpc通訊;
datanode和namenode之間是經過rpc通訊;
client和datanode之間是經過簡單的socket通訊。
Client讀取HDFS中數據的流程
1. 客戶端經過調用FileSystem對象的open()方法打開但願讀取的文件。
2. DistributedFileSystem經過使用RPC來調用namenode,以肯定文件起始塊的位置。[注1]
3. Client對輸入流調用read()方法。
4. 存儲着文件起始塊的natanoe地址的DFSInputStream[注2]隨即連接距離最近的datanode。經過對數據流反覆調用read()方法,能夠將數據從datanode傳輸到Client。[注3]
5. 到達快的末端時,DFSInputStream會關閉與該datanode的鏈接,而後尋找下一個快遞最佳datanode。
6. Client讀取數據是按照卡開DFSInputStream與datanode新建鏈接的順序讀取的。它須要詢問namenode來檢索下一批所須要的datanode的位置。一旦完成讀取,調用FSDataInputStream調用close()方法。
[注1]:對於每個塊,namenode返回存在該塊副本的datanode地址。這些datanode根據他們於客戶端的距離來排序,若是客戶端自己就是一個datanode,並保存有響應數據塊的一個副本時,該節點從本地datanode中讀取數據。
[注2]:Di是tribute File System類返回一個FSDataInputStream對象給Client並讀取數據。FSDataInputStream類轉而封裝DFSInputStream對象,該對象管理datanode和namenode的I/O。
[注3]:若是DFSInputStream在與datanode通訊時遇到錯誤,它便會嘗試從這個塊的另一個最臨近datanode讀取數據。它也會記住哪一個故障的natanode,以保證之後不回反覆讀取該節點上後續的塊。DFSInputStream也會經過校驗和確認從datanode發來的數據是否完整。若是發現一個損壞的塊,它就會在DFSinputStream視圖從其餘datanode讀取一個塊的副本以前通知namenode。
Client將數據寫入HDFS流程
1. Client調用DistributedFileSystem對象的create()方法,建立一個文件輸出流
2. DistributedFileSystem對namenode建立一個RPC調用,在文件系統的命名空間中建立一個新文件。
3. Namenode執行各類不一樣的檢查以確保這個文件不存在,而且客戶端有建立該文件的權限。若是這些檢查均經過,namenode就會爲建立新文件記錄一條記錄,不然,文件建立失敗,向Client拋出IOException,DistributedFileSystem向Client返回一個FSDataOutputStream隊形,Client能夠開始寫入數據。
4. DFSOutputStream將它分紅一個個的數據包,並寫入內部隊列。DataStreamer處理數據隊列,它的責任時根據datanode列表來要求namenode分配適合新塊來存儲數據備份。這一組datanode構成一個管線---咱們假設副本數爲3,管路中有3個節點,DataStreamer將數據包流式牀書到管線中第一個datanode,該dananode存儲數據包並將它發送到管線中的第二個datanode,一樣地,第二個datanode存儲該數據包而且發送給管縣中的第3個。
5. DFSOutputStream也維護着一個內部數據包隊列來等待datanode的收到確認回執(ack queue)。當收到管道中全部datanode確認信息後,該數據包纔會從確認隊列刪除。[注1]
6. Client完成數據的寫入後,回對數據流調用close()方法
7. 將剩餘全部的數據包寫入datanode管線中,而且在練習namenode且發送文件寫入完成信號以前。
[注1]:若是在數據寫入期間,datanode發生故障,則:1.關閉管線,確認把隊列中的任何數據包添加回數據隊列的最前端,一去到故障節點下游的datanode不回漏包。2.爲存儲在另外一個正常datanode的當前數據塊指定一個新的標誌,並將給標誌傳給namenode,以便故障datanode在恢復後能夠刪除存儲的部分數據塊。3.從管線中刪除故障數據節點,而且把餘下的數據塊寫入管線中的兩個正常的datanode。namenode注意到副本量不足時,會在另外一個節點上建立一個新的副本。