Hadoop HDFS簡單介紹

一、HDFS相關概念簡介
關於HDFS百度百科介紹如下:
 
HDFS相關概念及體系簡介
  1. HDFS:Hadoop Distributed File System,使用JAVA語言實現的分佈式、可橫向擴展的文件系統
  2. 它包含一個名稱節點NameNode和多個數據節點DataNode,屬於主/從(Master/Slave)關係結構模型
  3. 名稱節點,負責管理文件系統命名空間及客戶端對文件的訪問,它是一箇中心服務器
  4. 數據節點,一般來說是一個節點運行一個數據節點進程,每個數據節點上的數據實際上保存在本地的Linux文件系統中,負責處理文件系統客戶端讀/寫請求,或刪除、創建和複製數據塊等操作
 
HDFS的設計理念
        設計的目標:大數據量存儲、低成本及高容錯率、數據一致性、順序訪問數據
  1. 大數據量存儲
        存儲總量可以達到PB/EB級別,普通單個文件一般在幾百MB
  1. 低成本及高容錯率
        本身Hadoop運行不需要在昂貴的設備上,這就意味着對於集羣來說,節點發生一故障的可能性更高,從而在設計上HDFS就考慮到了這種高容錯的機制,保障在遇到故障時客戶可以無明顯感知
  1. ​數據一致性
  2. 順序訪問數居
        HDFS更適合於處理批量數據,而不適合隨機定位訪問
 
HDFS的優缺點
  1. 優點
        高容錯性,多個副本的存在保證了這種容錯性
        適合批處理
        適合大數據處理(數據規模上可以達到GB、TB甚至是PB級別數據;文件規模上可以處理百萬規模以上的文件數量;節點規模上可以處理10K節點的規模)
        對於設備沒有特別的要求
  1. ​缺點
        不適合低延遲時數據訪問(如:毫秒級來存儲數據做不到)
        不適合於小文件的存取,它會佔用NameNode大量的內存來存儲文件、目錄和塊信息;小文件存儲的尋道時間會超過讀取時間
        併發寫入,文件隨機修改,一個文件只能有一個寫入者,僅支持append(日誌),不允許修改文件
 
HDFS的執行原理簡介
        客戶端有文件讀寫請求--->NameNode(名稱節點,管理節點)接收到讀寫服務請求--->根據Metadata元數據(包含元數據的鏡像fsimage、操作日誌edits信息)等信息--->與DataNode進行通信,進行資源的協調--->Secondary NameNode進行edits和fsimage的合併,同時DataNode之間進行數據複製。
如果要進行大文件存儲其操作的方式如下:
        對文件進行按塊切割,分別把它們放在不同的節點,每個文件都會有3個副本備份,並且同時會有一個記錄文件塊存放情況的元數據文件以備查詢。
 
二、HDFS核心概念介紹
        通過上面對HDFS的概念簡介我們對HDFS有了一個宏觀上的簡單瞭解,下面則介紹一下HDFS中的核心概念以便於未來對於HDFS原理的深入理解
  1. block數據塊
        block塊,它概念類似於磁盤中的數據塊大小,是磁盤上的早小讀寫單位,在HDFS中也有塊的概念。HDFS 1.x中默認的數據塊大小是64MB;HDFS 2.x中默認的塊大小是128MB。
        注意:這裏的塊的大小與磁盤不同的是當一個文件大小小於數據塊的默認大小時並不會佔滿整個塊的空間(如,只有一個10MB的文件存儲在一個128MB的塊中時,文件只會佔用10MB的磁盤空間),但是磁盤的上的文件系統則是不夠最小塊大小時也會佔一個塊空間的大小。
  1. ​NameNode
        它是HDFS集羣中的管理節點。一個集羣中通常只有一臺活動的NameNode它存放了HDFS的元數據具一個集羣只有一份元數據存在
        NameNode中保存的Metadata信息包括文件ownership、permissions、文件有哪些block、block存放在哪些DataNode等
  1. ​DataNode
        DataNode爲數據節點,它其中的文件的存儲方式是按大小分成若干個block,存儲到不同的節點上,block大小和副本數通過客戶端上傳文件時設置,文件上傳成功後,副本數可以改變,但是塊的大小是不可以變更的。默認情況下每個block都有3個副本
  1. ​SecondaryNameNode
        它有簡稱爲SNN,主要的工作是幫NameNode合併 edits,減少NameNode啓動時間,SNN執行合併的時機有如下兩個:
        配置文件中設置的時間間隔fs.check-point.period,默認爲3600秒(默認配置是一個小時合併一次)
        配置 文件中設置edits log大小fs.check-point.size,規定edits文件的最大值默認爲64MB
  1. ​元數據
        元數據保存在NameNode的內存當中,這樣可以加速查詢,它就要包含fsimage和edits
        fsimage:元數據鏡像文件(保存文件系統的目錄樹)
        edits:元數據操作日誌(針對元數據的修改操作)
 
三、HDFS讀取文件的流程
        對於存儲在HDFS上的文件客戶端讀取的流程如下:
  1. 客戶端調用FileSystem對象的open()方法打開要讀取的文件。這個對象是DistrbutedFileSystem的一個實例
  2. DistrbutedFileSystem通過使用遠程過程調用(RPC)來調用NameNode,確定文件起始塊位置
  3. 對於每個block,NameNode返回到存有這個塊副本的DataNode地址。同時,這些DataNode根據它們與客戶端的距離來排序,DistrbutedFileSystem類返回一個FSDataInputStream對象給客戶端並讀取數據,FSDataInputStream轉而封裝DFSInputStream對象,這個對象管理着DataNode和NameNode的I/O。客戶端對輸入流調用read()方法
  4. 存儲文件起始幾個塊的DataNode地址的DFSInputStream,接下來會連接距離最近的文件中第一個塊所在DataNode。通過對數據反覆調用read()方法,實現把數據從DataNode傳輸到客戶端
  5. 當臨近塊的未端時,DFSInputStream會關閉與這個DataNode的連接,然後去尋找下一個最佳的DataNode
  6. 客戶端從流中讀取數據時,塊是按打開的DFSInputStream與DataNode新建連接的順序進行讀取的,也可以根據需要詢問NameNode從而檢索下一批數據塊的DataNode的位置,一旦客戶端完成讀取就對FSDataInputStream調用close()方法
 
四、HDFS寫文件流程
        對於存儲在HDFS上的文件也可以寫入內容,客戶端發送寫文件的流程如下:
  1. ​客戶端調用DistributedFileSystem對象create()方法新建文件
  2. DistributedFileSystem對NameNode創建一個RPC調用,在文件命名這間中創建一個新文件,這個時候文件中沒有相應的數據塊
  3. NameNode檢查來確定空上文件不存在而且客戶端有新建這個文件的權限,如果檢查通過了,NameNode會爲創建新文件寫下一條記錄,反之則會拋出一個異常:IOException
  4. DistributedFileSystem向客戶端返回一個FSDataOutputStream對象,這個樣客戶端就可以寫入數據了,同樣的這個對象會封裝一個DFSOuptStream對象,它負責處理DataNode與NameNode之間的通信。在寫數據時它會把數據分成一個一個數據包,並且寫入內部隊列,也就是數據隊列(data queue)
  5. DataStream處理數據隊列,它負責選出適合用於存儲數據副本的一組DataNode,並要求NameNode分配新的數據塊。這一組DataNode會構成一條管線,DataStream會將數據包流式轉輸到管線中的第一個DataNode,然後依次存儲併發送給下一個DataNode
  6. DFSOutPutStream也維護着一個內部數據包隊列來等待DataNode的收到確認回執,這個稱爲“確認隊列”(ask queue),收到管線中所有DataNode確認信息後,這個數據包纔會從確認隊列刪除
  7. 客戶端完成數據的寫入後,會對數據流調用close()方法
 
五、block副本的存放策略
        HDFS中文件作爲獨立存儲單元,被劃分爲塊大小的多個塊進行存儲,同時HDFS爲了保證容錯性對於塊需要自動保存多份副本(默認爲三個副本),各個副本的存放策略簡單介紹如下:
        第一個副本:存放在上傳文件的DN,如果是集羣外提交的,則隨機挑選一臺磁盤空間更大,CPU更壓力更小的DN存儲
        第二個副本:存放在與第一個副本不同的機架機點上
        第三個副本:存放在與第二個副本相同的機架上
        其它的副本:如果有其它的副本則隨機節點存儲
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章