大數據學習筆記:Hadoop之HDFS(上)
HDFS(Hadoop Distributed File System )Hadoop分散式文件系統。是根據google發表的論文翻版的。分散式文件系統(Distributed File System)是指文件系統管理的物理存儲資源不一定直接連接在本地節點上,而是通過計算機網路與節點相連。分散式文件系統的設計基於客戶機/伺服器模式。
[優點]
支持超大文件:超大文件在這裡指的是幾百M,幾百GB,甚至幾TB大小的文件。
檢測和快速應對硬體故障:在集群的環境中,硬體故障是常見的問題。因為有上千台伺服器連接在一起,這樣會導致高故障率。因此故障檢測和自動恢復是hdfs文件系統的一個設計目標
流式數據訪問:應用程序能以流的形式訪問數據集。主要的是數據的吞吐量,而不是訪問速度。
簡化的一致性模型:大部分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,以確定文件起始塊的位置。
3. Client對輸入流調用read()方法。
4. 存儲著文件起始塊的natanoe地址的DFSInputStream[注2]隨即鏈接距離最近的datanode。通過對數據流反覆調用read()方法,可以將數據從datanode傳輸到Client。
5. 到達快的末端時,DFSInputStream會關閉與該datanode的連接,然後尋找下一個快遞最佳datanode。
6. Client讀取數據是按照卡開DFSInputStream與datanode新建連接的順序讀取的。它需要詢問namenode來檢索下一批所需要的datanode的位置。一旦完成讀取,調用FSDataInputStream調用close()方法。
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確認信息後,該數據包才會從確認隊列刪除。
6. Client完成數據的寫入後,回對數據流調用close()方法
7. 將剩餘所有的數據包寫入datanode管線中,並且在練習namenode且發送文件寫入完成信號之前。
敬請關注下篇,如需大數據學習資料請關注公眾號:程序員交流學習
推薦閱讀:
※大數據實驗手冊怎麼自己搭環境?
※從頭學習大數據培訓課程 hadoop,mapreducer 分散式計算框架(二) Windows 偽分散式環境部署
※有什麼方案可以代替 Impala?
※分散式計算框架 Hadoop 為什麼叫 "Hadoop" ?
※數據之路(Hadoop)我該如何打好基礎?