Hadoop系列(二)Hadoop三大核心之HDFS基礎


針對海量數據,核心問題始終是計算和存儲。當數據集的大小超過一臺獨立物理計算機的存儲能力時,就有必要對它進行分區並存儲到多臺機器上。跨機器存儲的文件系統就被成爲分佈式文件系統。分佈式系統架構於網絡之上,勢必引入網絡編程的複雜性,如何實現容忍節點故障但不丟失數據,是HDFS的重要挑戰。

hdfs基礎

Hadoop 自帶HDFS分佈式文件系統:Hadoop Distributed Filesystem。也簡稱DFS。主要用來解決海量數據的存儲問題。

HDFS有以下兩點特性

  • 文件系統:用於存儲文件,通過統一目錄樹定位
  • 分佈式:很多機器共同支撐其功能

重要概念

數據塊

和一般的文件系統一樣,HDFS也有塊(block)的概念,HDFS上的文件也被劃分爲塊大小的多個分塊作爲獨立的存儲單元。

Hadoop 1.x 默認大小爲64MB, 2.x和3.x均爲128MB。具體指定版本的默認值,可參見官網塊的定義。HDFS的塊比磁盤的塊大,是爲了最小化尋址開銷,減少尋址定位所需時間。

與磁盤文件系統不一樣的是**HDFS中小於一個塊大小的文件不會佔據整個塊的空間 **例:當一個1MB的文件存儲在一個128MB的塊中時,文件只使用1MB的磁盤空間,而不是128MB。當一個150M的文件要存儲到HDFS中,將會拆分成2個塊,大小分別是128M、22M。

設置數據塊的好處:

(1)一個文件的大小可以大於集羣任意節點磁盤的容量

(2)容易對數據進行備份,提高容錯能力,塊丟失可快速從其它節點複製

(3)使用抽象塊概念而非整個文件作爲存儲單元,大大簡化存儲子系統的設計

HDFS集羣有兩類節點以管理節點-工作節點的方式運行。即NameNode和DataNode。

NameNode(NN)

文件系統的管理節點。管理文件系統的命名空間,維護着文本系統樹及整棵樹內所有文件和目錄。基於內存存儲,在內存中保存着文件系統每個文件和每個數據塊的引用關係以及塊信息等。文件目錄在NameNode重啓後,需要重建。

功能:

  • 接收客戶端讀寫服務
  • 收集DataNode彙報的Block列表信息

DataNode(DN)

文件系統的工作節點,多個節點共同工作。本地磁盤目錄存儲數據,文件形式。

功能:

  • 文件形式存儲數據(Block)
  • 存儲Block的元數據信息文件 (md5)
  • 啓動時向NameNode彙報block信息
  • 與NameNode保持心跳連接(3s/次)

NameNode雖然以內存方式存儲,但是NameNode也會在適當時候持久化兩類文件到磁盤。

  • fsimage:NameNode啓動時對整個文件系統的快照
  • edit logs:NameNode啓動後,對文件系統的改動序列

只有在NameNode重啓時,edit logs纔會合併到fsimage文件中,從而得到一個文件系統的最新快照。但是在產品集羣中NameNode是很少重啓的,這也意味着當NameNode運行了很長時間後,edit logs文件會變得很大。這會引發以下嚴重問題:1.edit logs文件會變的很大,不容易管理;2.重啓會花費很長時間,因爲有很多改動,可能經歷好幾個小時甚至幾十個小時,這是不能容忍的。

Secondary NameNode (SNN)

SecondaryNameNode就是來幫助解決上述問題的,職責是幫助NN合併edits log成fsimage,減少NameNode啓動時間

SNN 合併edits觸發條件:
1.定期觸發。默認一小時。
2.時間未到的情況,edits log大小超過容量也會觸發。默認 64M。

配置文件core-site.xml 可設置時間間隔(fs.checkpoint.period )和edits log容量(fs.checkpoint.size)。

Hadoop 特點

HDFS也是按照Master和Slave的結構。分NameNode、SecondaryNameNode、DataNode這幾個角色。

因其架構方案,擁有很多特點:
保存多個副本,且提供容錯機制,副本丟失或宕機自動恢復(默認存3份)。
  可運行在廉價的機器上
  適合大數據的處理。HDFS默認會將文件分割成block。然後將block按鍵值對存儲在HDFS上,並將鍵值對的映射存到內存中。

當然HDFS也有其侷限性:
1.低延時數據訪問。在用戶交互性的應用中,應用需要在ms或者幾個s的時間內得到響應。由於HDFS爲高吞吐率做了設計,也因此犧牲了快速響應。對於低延時的應用,可以考慮使用HBase或者Cassandra。
2.大量的小文件。標準的HDFS數據塊的大小是64M,存儲小文件並不會浪費實際的存儲空間,但是無疑會增加了在NameNode上的元數據,大量的小文件會影響整個集羣的性能。
3.多用戶寫入,修改文件。HDFS的文件只能有一個寫入者,而且寫操作只能在文件結尾以追加的方式進行。它不支持多個寫入者,也不支持在文件寫入後,對文件的任意位置的修改。
但是在大數據領域,分析的是已經存在的數據,這些數據一旦產生就不會修改,因此,HDFS的這些特性和設計侷限也就很容易理解了。HDFS爲大數據領域的數據分析,提供了非常重要而且十分基礎的文件存儲功能。

Hadoop HA

可靠性

  1. 冗餘備份
    每個文件存儲成一系列數據塊(Block)。爲了容錯,文件的所有數據塊都會有副本(副本數量即複製因子,可配置)(dfs.replication)
  2. 副本存放
    採用機架感知(Rak-aware)的策略來改進數據的可靠性、高可用和網絡帶寬的利用率
  3. 心跳檢測
    NameNode週期性地從集羣中的每一個DataNode接受心跳包和塊報告,收到心跳包說明該DataNode工作正常
  4. 安全模式
    系統啓動時,NameNode會進入一個安全模式。此時不會出現數據塊的寫操作。
  5. 數據完整性檢測
    HDFS客戶端軟件實現了對HDFS文件內容的校驗和(Checksum)檢查(dfs.bytes-per-checksum)。

單點故障問題

因爲NameNode部署爲單點失效,存在單點故障問題,當NameNode,那麼客戶端或MapReduce作業均無法讀寫查看文件。注意HDFS已有存儲不會丟失。

解決方案:

啓動一個擁有文件系統元數據的新NameNode(這個一般不採用,因爲複製元數據非常耗時間)
配置一對活動-備用(Active-Sandby)NameNode,活動NameNode失效時,備用NameNode立即接管,用戶不會有明顯中斷感覺。
    共享編輯日誌文件(藉助NFS、zookeeper等)
    DataNode同時向兩個NameNode彙報數據塊信息
    客戶端採用特定機制處理 NameNode失效問題,該機制對用戶透明

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