Hadoop1和Hadoop2的區別
- 2019 年 12 月 23 日
- 筆記

Hadoop1和Hadoop2的區別主要在於下方面:
Namenode
JobTracker 和 YARN
HDFS聯合
HDFS快照
序列化方式
支援SSD感知
HDFS IO方面的改進
支援更多的作業系統
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的狀態。
JobTracker 和 YARN
Hadoop1採用集中式作業流控制,然而集中式系統由於其負載的單點問題,很難實現擴展。一旦JobTracker(作業跟蹤器)出現故障,系統中所有的作業都必須重新啟動,這對整個集中式組件造成了極大壓力。由於計算模型是和集群的資源緊密聯繫的,所以只能支援MapReduce一種計算模型。這種緊密的耦合導致開發者強行適配其他的計算模型,從而出現了與MapReduce設計意圖相悖的使用方式。按照這種模式,Hadoop很難與其他類型的集群進行集成。
Hadoop2引入了YARN。YARN的主要設計目標是將大家比較關注的資源管理(resource management)和應用執行(application execution)之間的耦合隔離,然後其他的應用模式就可以在Hadoop集群上執行了。增強不同計算模型和各種應用之間的交互,使得集群的資源得到高效的利用,同時也能更好地與企業中已經存在的計算結構集成在一起。
HDFS聯合
Hadoop1中,HDFS和塊管理層緊緊地耦合在一起,難以集成其他的存儲服務。
在Hadoop2實現了一個更為通用的存儲模型。一個通用的塊存儲(block storage)層已經從文件系統層隔離出來。這種隔離使得其他存儲服務有機會被集成到Hadoop集群中。這種通用存儲模型使得HDFS聯合(HDFS Federation)功能得以實現。這個功能允許多個HDFS命名空間使用相同的底層存儲設備,且聯合的NameNode節點提供了文件系統層面的隔離功能。在第10章中,我們會詳細介紹這個特性。
HDFS快照
Haddoop2 引入了快照(snapshot)。快照是文件系統的整體或部分目錄在某個時間點的只讀鏡像(image),通常是為了以下三個原因:
防止用戶的錯誤操作導致的數據損壞或丟失、備份、容災
快照僅在NameNode上實現,它不會涉及數據從一個數據節點複製到另一個數據節點,而僅僅是複製了塊列表以及文件的大小。生成一個快照的操作幾乎是瞬間完成的,它不會影響NameNode節點的性能。
序列化方式
Hadoop1的RPC通訊協議是使用Java的Writables序列化實現的,但在Hadoop2中是基於Protocol Buffers實現的。這個改進不僅很容易保持向後兼容,而且幫助集群中的不同組件實現了滾動升級(rolling the upgrades)。另外,RPC也允許在客戶端實現重試功能。
支援SSD感知
Hadoop1是不感知存儲設備的類型的,這意味著機械硬碟和SSD(固態硬碟)被一樣對待。用戶無法對數據的布局做任何干預。2014年發布的Hadoop2版本能夠識別存儲設備的類型,並且應用程式可以獲取到這些資訊。這樣,應用程式就可以通過這些資訊來優化它們的數據存取和布局策略。
HDFS IO方面的改進
Hadoop1是通過HDFS客戶端訪問文件系統的。Hadoop2開始支援NFSv3,促進了NFS網關組件的誕生。現在,HDFS可以掛載(mount)到用戶本地兼容的文件系統上,他們可以直接往HDFS下載或上傳文件。往已有的文件追加內容是可以的,但是隨機寫(random write)是不支援的。同時,Hadoop2的I/O也進行了大量的改進。例如,在Hadoop1中,當客戶端運行在某個數據節點上時,它需要通過TCP來讀取本地數據。但是,有了本地快捷讀取(short-circuit local reads),客戶端就可以直接讀取本地的數據;通過特定的介面還可以實現零複製(zero-copy)數據讀取;讀或寫數據的CRC校驗碼計算方法也進行了優化。
支援更多的作業系統
Hadoop 2.X天然支援微軟的Windows系統。這個轉變使得微軟的Windows伺服器有極好的機會進入大數據處理領域。當然,部分原因得歸功於Hadoop開發使用的Java程式語言有很好的可移植性,但更重要的原因在於Hadoop對計算和存儲的通用性的增強,使其能支援包括Windows在內的系統。