Hadoop生態圈之HDFS文件數據讀寫

問一問自己,Hadoop是如何實現HDFS文件存儲系統的呢?

特點:

1)大數據文件分割存儲

   磁盤默認的數據塊大小,是對磁盤數據讀寫時要求的最小單位,通常磁盤的塊是512字節。文件系統構建於磁盤上,所以需要設計成磁盤塊整數倍。HDFS於是就有了塊的概念(block)默認大小是64M,其目的是最小化尋址開銷。一個超大文件G、T、P級別,分割成若干塊,但是這些塊並不需要存儲在同一個磁盤上,採用分佈式存儲邏輯,單位塊可以存儲在集羣中任意磁盤。

2)一次寫入多次讀取。

3)分佈式可以運行在廉價的機器上。

特點優秀,缺點也非常明顯;

1)不能實時查詢數據,較低延遲的查詢。

2)大量小文件,小文件通常定義爲遠小於block size(64M)的文件,由於每個文件都產生各自的Metadata元數據,通過nameNode存儲這些信息,若小文件過多會造成nameNode存儲瓶頸。

3)寫入更新問題,hadoop是一次寫入多次讀取,不支持多用戶寫入,若要更新也是文件追加到文件尾的方式,出現太多文件更新情況,hadoop是不支持的。

4)結構化數據,HDFS適合存儲半結構化和非結構化的數據。個人理解都可以存儲。

5)通常處理TB、PB級的數據,較小的話不適合使用Hadoop。

集羣的主從結構:nameNode系統通常只有一個名字節點,中心服務器的角色,管理dataNode實際數據所需的元數據Metadata。dataNode數據真正存儲的地方,在nameNode統一調度下進行數據塊的創建、刪除、複製,主要是針對block塊的操作。

 

存儲寫入文件的過程:

1、客戶端調用創建文件,HDFS調用nameNode節點,在命名空間中創建一個文件。節點首先確定原文件不存在,並且客戶端有創建文件的權限,然後創建文件。

2、創建文件完成,HDFS返回的是DFSOutputStream,客戶端用此開始寫入數據,由DFSOutpurStream把數據分成塊,寫入data queue數據隊列。

3、Data queuer隊列中的數據由data Streamer讀取,並通知nameNode節點分配數據節點,用來存儲數據塊(每塊默認複製3塊)。

4、nameNode分配的數據節點放在同一個pipeline裏。data Streamer把塊寫入到第一個節點裏,然後第一節點把數據塊發送到第二個節點,最後第二個節點把數據塊發送到第三個節點裏。

5、DFSOutputStream 爲發送出去的數據塊保存ACK Queue,等待pipeline中的數據節點告知數據已寫入成功。

數據塊複製策略:

運行客戶端的節點放一個副本(若客戶端運行在集羣之外,會隨機選擇一個節點存放第一個副本),第二個副本會放在與第一個副本不同隨機機架中節點上,第三個副本與第二個副本放在相同的機架上,隨機的另外一個點。提高容錯性能。所有的塊複製決策由nameNode統一複製,會週期性的接受集羣中的數據節點心跳和塊報告。

讀取存儲文件過程:

1、客戶端通過open函數打開文件,通過調用nameNode節點得到文件的數據塊信息。對於每一個數據塊,nameNode節點返回保存數據庫的數據節點地址。

2、DFS返回DFSDataInputStream給客戶端,用來讀取數據。調用 stream 的 read()函數開始讀取數據。連接保存此文件第一個數據塊的最近的數據節點。DataNode 從數據節點讀到客戶端,當此數據塊讀取完畢時,DFSInputStream 關閉和此數據節點的連接,然後連接此文件下一個數據塊的最近的數據節點。當客戶端讀取完畢數據的時候,調用FSDataInputStream 的 close 函數。在讀取數據的過程中,如果客戶端在與數據節點通信出現錯誤,則嘗試連接包含此數據塊的下一個數據節點。失敗的數據節點將被記錄,以後不再連接。





 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章