Hadoop到目前爲止發展已經有10餘年,版本通過了無數次的更新迭代,目前業內你們把Hadoop大的 版本分爲Hadoop1,hadoop2,Hadoop3三個版本。安全
hadoop1版本剛出來的時候是爲了解決兩個問題:服務器
Hadoop1的核心設計就是HDFS和Mapreduce。架構
HDFS1是一個主從式的架構,主節點只有一個叫NameNode。從節點有多個叫DataNode。框架
雖然HDFS1當初設計出來能夠解決海量數據存儲的問題,但在使用的過程當中慢慢的出現了一些缺陷,其中主要爲如下兩點:oop
單點故障顧名思義就是單個節點發生了問題,致使HDFS出現了致命的缺陷。咱們都知道HDFS集羣是有多個節點組成的,其中最爲重要的節點就是NameNode所在的節點。NameNode掌管着全部數據存儲的元數據信息。一旦NameNode發生故障則整個HDFS就不可用了。優化
那麼HDFS爲了解決這個問題,就提出了高可用的方案,意思就是多一個NameNode,當其中一個掛了或失去通信的時候,另一個能夠替代,從而維持HDFS的可用性,實現自動容災的功能。spa
爲了實現自動容災,能夠引入第三方框架集羣,這裏zookeeper就登場了。zookeeper在與NameNode進行通信的時候會建立一把鎖,持有這把鎖的NameNode則被看成active NameNode,另外備份的NameNode被看成standby NameNode。同時後臺還會起一個監聽的線程ZKFC來監測NameNode。一旦監測到active NameNode出現問題,則standby NameNode自動切換。線程
引入另一個NameNode就要考慮數據一致性的問題。當前的NameNode掛掉狀況下,高可用的NameNode頂上的時候如果與以前掛掉的NameNode元數據信息保存不一致的話,則會發生一些請求找不到對應數據的狀況。會讓咱們從主觀意識的數據缺失了。設計
那麼爲了不這一現象的發生就要保持數據的一致性。這裏HDFS引入了共享文件系統的概念,它會在後臺啓動必定數量的JournalNode進程(同步存儲元數據,壓力較小),組成一個共享的文件系統,存儲元數據(editlog)。固然journalNode自己也是實現高可用的。active NameNode將元數據實時寫入JournalNode,standby NameNode實時讀取元數據信息,從而維持active NameNode,standby NameNode二者元數據一致。進程
高可用方案讓單點故障問題得以解決。也讓咱們知道了NameNode的重要性,咱們之因此能這麼快的經過NameNode檢索到存儲在DataNod的數據,是由於NameNode將元數據都讀取到內存中,檢索效率大大超於磁盤。
那麼隨着數據的日積月累,元數據的愈來愈龐大,NameNode的內存是否夠存在受限。答案是必定存在的,NameNode自己也是一臺服務器,裝配的內存確定是受限的。那麼當內存受限的時候,添加這臺的內存也是能夠臨時解決燃眉之急的。但卻治標不治本。咱們自己集羣由這麼多臺服務器組成,一臺節點的內存不夠用,能夠利用其餘的服務器內存來完成這數據的檢索。
因此,這裏HDFS就運用了聯邦機制(Federation)。
聯邦機制的原理就是將NameNode劃分爲不一樣的命名空間並進行編號(這裏能夠想像成計算機中的C,D,E盤等)。不一樣的命名空間之間互不干擾。在DataNode中建立目錄,此目錄對應命名空間的編號。由此,編號相同的數據由對應的命名空間進行管理。固然爲了不單點故障問題,依舊採用高可用方案。
由此,HDFS解決了單點故障和內存受限的問題,HDFS1也進入了HDFS2的時代,這也是咱們如今常用的版本,也是相對穩定版本。
解決HDFS1 NameNode單點故障問題。
解決了HDFS1 內存受限問題。
至於HDFS3是在HDFS2的基礎上優化了HA方案,並加入了糾刪碼的技術。
HA方案的優化主要是支持了多個NameNode,使得生產環境更加可靠一些。
糾刪碼技術誕生的背景是因爲HDFS中3個副本的存儲開銷在某些場景下過大。例如一些冷數據的存儲3份副本對於成原本說就顯得有些浪費了。
所以,一個天然的改進是使用糾刪碼(EC)來代替副本,它提供了同等級別的容錯能力,並且存儲空間大大減小。在典型的糾刪碼(EC)設置中,存儲開銷不超過50% 。EC 文件的複製因子是無心義的。它老是1,不能經過 -setorp 命令更改。
有了糾刪碼技術的加入,故而HDFS3既提升了存儲效率的同時又保持住了數據的持久性的特色。