Hadoop2 和 Hadoop1的區別
1. Namenode
NameNode其實是Hadoop的一個目錄服務,它包含着整個集群存儲的文件的元數據。
早期發行的Hadoop1版本將所有HDFS目錄和文件的元數據存儲到一個NameNode單點。整個集群的數據狀態取決於這個單點的成敗。隨后的版本添加了一個secondary NameNode節點,作為冷備份的從NameNode節點。Secondary NameNode節點周期性地將寫日志(edit log)和NameNode的映象文件(image file)合並,這樣做有兩個優點:首先,由於主NameNode節點在啟動的時候不需要完全合並寫日志和映象文件,因此主NameNode節點的啟動時間縮短了;其次,從NameNode節點復制NameNode的所有信息,這樣當NameNode節點出現不可恢復的故障時,數據丟失會降到最低。但是,secondary NameNode並不是一個熱備份節點,這意味着故障切換時間和恢復時間較長,且集群可用性會受到影響。
Hadoop2做出了改進,有了NameNode的熱備節點。當主NameNode節點故障了,從NameNode就能夠在自動轉變成主NameNode,這就意味着hadoop集群可以提供無數據丟失且不間斷的NameNode服務,並且自動故障切換也比較容易實現。
熱備份的關鍵在於維護它的數據盡可能與主NameNode節點保持一致,可以通過讀取主NameNode的寫日志文件並在備份節點上執行來實現,並且延時也是非常低的。寫日志文件的共享可以使用以下兩種方法來實現:
-
在主NameNode和從NameNode節點間使用共享的網絡文件系統(Network File System,NFS)存儲目錄:主NameNode往共享目錄中寫入日志,而從NameNode監聽這個共享目錄的變更消息,然后拉取這些變更。
-
使用一組JournalNode(quorum of Journal Nodes):主NameNode將寫日志發送到部分JournalNode以記錄信息,而從NameNode持續監聽這些JournalNode,從而更新和同步主NameNode的狀態。
2. JobTracker 和 YARN
Hadoop1采用集中式作業流控制,然而集中式系統由於其負載的單點問題,很難實現擴展。一旦JobTracker(作業跟蹤器)出現故障,系統中所有的作業都必須重新啟動,這對整個集中式組件造成了極大壓力。由於計算模型是和集群的資源緊密聯系的,所以只能支持MapReduce一種計算模型。這種緊密的耦合導致開發者強行適配其他的計算模型,從而出現了與MapReduce設計意圖相悖的使用方式。按照這種模式,Hadoop很難與其他類型的集群進行集成。
Hadoop2引入了YARN。YARN的主要設計目標是將大家比較關注的資源管理(resource management)和應用執行(application execution)之間的耦合隔離,然后其他的應用模式就可以在Hadoop集群上執行了。增強不同計算模型和各種應用之間的交互,使得集群的資源得到高效的利用,同時也能更好地與企業中已經存在的計算結構集成在一起。
3. HDFS聯合
Hadoop1中,HDFS和塊管理層緊緊地耦合在一起,難以集成其他的存儲服務。
在Hadoop2實現了一個更為通用的存儲模型。一個通用的塊存儲(block storage)層已經從文件系統層隔離出來。這種隔離使得其他存儲服務有機會被集成到Hadoop集群中。這種通用存儲模型使得HDFS聯合(HDFS Federation)功能得以實現。這個功能允許多個HDFS命名空間使用相同的底層存儲設備,且聯合的NameNode節點提供了文件系統層面的隔離功能。在第10章中,我們會詳細介紹這個特性。
4. HDFS快照
Haddoop2 引入了快照(snapshot)。快照是文件系統的整體或部分目錄在某個時間點的只讀鏡像(image),通常是為了以下三個原因:
防止用戶的錯誤操作導致的數據損壞或丟失、備份、容災
快照僅在NameNode上實現,它不會涉及數據從一個數據節點復制到另一個數據節點,而僅僅是復制了塊列表以及文件的大小。生成一個快照的操作幾乎是瞬間完成的,它不會影響NameNode節點的性能。
5. 序列化方式
Hadoop1的RPC通信協議是使用Java的Writables序列化實現的,但在Hadoop2中是基於Protocol Buffers實現的。這個改進不僅很容易保持向后兼容,而且幫助集群中的不同組件實現了滾動升級(rolling the upgrades)。另外,RPC也允許在客戶端實現重試功能。
6. 支持SSD感知
Hadoop1是不感知存儲設備的類型的,這意味着機械硬盤和SSD(固態硬盤)被一樣對待。用戶無法對數據的布局做任何干預。2014年發布的Hadoop2版本能夠識別存儲設備的類型,並且應用程序可以獲取到這些信息。這樣,應用程序就可以通過這些信息來優化它們的數據存取和布局策略。
7. HDFS IO方面的改進
Hadoop1是通過HDFS客戶端訪問文件系統的。Hadoop2開始支持NFSv3,促進了NFS網關組件的誕生。現在,HDFS可以掛載(mount)到用戶本地兼容的文件系統上,他們可以直接往HDFS下載或上傳文件。往已有的文件追加內容是可以的,但是隨機寫(random write)是不支持的。同時,Hadoop2的I/O也進行了大量的改進。例如,在Hadoop1中,當客戶端運行在某個數據節點上時,它需要通過TCP來讀取本地數據。但是,有了本地快捷讀取(short-circuit local reads),客戶端就可以直接讀取本地的數據;通過特定的接口還可以實現零復制(zero-copy)數據讀取;讀或寫數據的CRC校驗碼計算方法也進行了優化。
8. 支持更多的操作系統
Hadoop 2.X天然支持微軟的Windows系統。這個轉變使得微軟的Windows服務器有極好的機會進入大數據處理領域。當然,部分原因得歸功於Hadoop開發使用的Java編程語言有很好的可移植性,但更重要的原因在於Hadoop對計算和存儲的通用性的增強,使其能支持包括Windows在內的系統。時下,雲服務商將Hadoop作為一種按需分配的服務,作為其平台即服務(Platform-as-a-Service)產品的一部分。Hadoop2也支持OpenStack,促進了在雲端的彈性和虛擬化部署。