1. 程式人生 > >Hadoop學習筆記—21.Hadoop2的改進內容簡介

Hadoop學習筆記—21.Hadoop2的改進內容簡介

做的 說明 後者 實踐 管理系 一個 變化 它的 軟件

Hadoop2相比較於Hadoop1.x來說,HDFS的架構與MapReduce的都有較大的變化,且速度上和可用性上都有了很大的提高,Hadoop2中有兩個重要的變更:

(1)HDFS的NameNode可以以集群的方式布署,增強了NameNodes的水平擴展能力和高可用性,分別是:HDFS Federation與HA;

(2)MapReduce將JobTracker中的資源管理及任務生命周期管理(包括定時觸發及監控),拆分成兩個獨立的組件,並更名為YARN(Yet Another Resource Negotiator);

一、HDFS的改進

1.1 Hadoop1.x時代的HDFS架構

  在Hadoop1.x中的NameNode只可能有一個,雖然可以通過SecondaryNameNode與NameNode進行數據同步備份,但是總會存在一定的時延

,如果NameNode掛掉,但是如果有部份數據還沒有同步到SecondaryNameNode上,還是可能會存在著數據丟失的問題。該架構如圖1所示:

技術分享

  圖1 Hadoop1.x時代的HDFS結構圖

  該架構包含兩層:Namespace 和 Block Storage Service;

  其中,Namespace 層面包含目錄、文件以及塊的信息,支持對Namespace相關文件系統的操作,如增加、刪除、修改以及文件和目錄的展示;

  而Block Storage Service層面又包含兩個部分:

  ①Block Management(塊管理)維護集群中DataNode的基本關系,它支持數據塊相關的操作,如:創建數據塊,刪除數據塊等,同時,它也會管理副本的復制和存放。

  ②Physical Storage(物理存儲)存儲實際的數據塊並提供針對數據塊的讀寫服務。

  當前HDFS架構只允許整個集群中存在一個Namespace,而該Namespace被僅有的一個NameNode管理。這個架構使得HDFS非常容易實現,但是,它(見上圖)在具體實現過程中會出現一些模糊點,進而導致了很多局限性(下面將要詳細說明),當然這些局限性只有在擁有大集群的公司,像baidu,騰訊等出現。

Hadoop1.x的HDFS架構的局限:

(1)Block Storage和namespace高耦合

當前namenode中的namespace和block management的結合使得這兩層架構耦合在一起,難以讓其他可能namenode實現方案直接使用block storage。

(2)NameNode擴展性

HDFS的底層存儲是可以水平擴展的(解釋:底層存儲指的是datanode,當集群存儲空間不夠時,可簡單的添加機器已進行水平擴展),但namespace不可以。當前的namespace只能存放在單個namenode上,而namenode在內存中存儲了整個分布式文件系統中的元數據信息,這限制了集群中數據塊,文件和目錄的數目。

(3)NameNode性能

文件操作的性能制約於單個Namenode的吞吐量,單個Namenode當前僅支持約60K的task,而下一代Apache MapReduce將支持多余100K的並發任務,這隱含著要支持多個Namenode。

(4)隔離性

現在大部分公司的集群都是共享的,每天有來自不同group的不同用戶提交作業。單個namenode難以提供隔離性,即:某個用戶提交的負載很大的job會減慢其他用戶的job,單一的namenode難以像HBase按照應用類別將不同作業分派到不同namenode上。

1.1 HDFS Federation

  (1)全新的Feration架構

  在Hadoop2.x中,HDFS的變化主要體現在增強了NameNode的水平擴展(Horizontal Scalability)及高可用性(HA)->【這不就是針對我們剛剛提到到的Hadoop1.x HDFS架構的局限性而做的改進,麽麽嗒!】,可以同時部署多個NameNode,這些NameNode之間是相互獨立,也就是說他們不需要相互協調,DataNode同時在所有NameNode中註冊,作為他們共有的存儲節點,並定時向所有的這些NameNode發送心跳塊使用情況的報告,並處理所有NameNode向其發送的指令。該架構如圖2所示:

技術分享

圖2 Hadoop2.x時代的HDFS結構圖

  該架構引入了兩個新的概念:存儲塊池(Block Pool) 和 集群ID(ClusterID);

  ①一個Bock Pool 是塊的集合,這些塊屬於一個單一的Namespace。DataNode存儲著集群中所有Block Pool中的塊。Block Pool的管理相互之間是獨立的。這意味著一個Namespace可以獨立的生成塊ID,不需要與其他Namespace協調。一個NameNode失敗不會導致Datanode的失敗,這些Datanode還可以服務其他的Namenode。

  一個Namespace和它的Block Pool一起稱作命名空間向量(Namespace Volume)。這是一個自包含單元。當一個NameNode/Namespace刪除後,對應的Block Pool也會被刪除。當集群升級時,每個Namespace Volume也會升級。

  ②集群ID(ClusterID)的加入,是用於確認集群中所有的節點,也可以在格式化其它Namenode時指定集群ID,並使其加入到某個集群中。

  (2)HDFS Federation與老HDFS架構的比較

①老HDFS架構只有一個命名空間(Namespace),它使用全部的塊。而HDFS Federation 中有多個獨立的命名空間(Namespace),並且每一個命名空間使用一個塊池(block pool)。

②老HDFS架構中只有一組塊。而HDFS Federation 中有多組獨立的塊。塊池(block pool)就是屬於同一個命名空間的一組塊。

③老HDFS架構由一個Namenode和一組datanode組成。而HDFS Federation 由多個Namenode和一組Datanode,每一個Datanode會為多個塊池(block pool)存儲塊。

1.2 NameNode的HA

  Hadoop中的NameNode好比是人的心臟,非常重要,絕對不可以停止工作。在Hadoop1.x時代,只有一個NameNode。如果該NameNode數據丟失或者不能工作,那麽整個集群就不能恢復了。這是Hadoop1.x中的單點問題,也是Hadoop1.x不可靠的表現,如圖1所示。Hadoop2的出現解決了這個問題,也被稱為HA。

  Hadoop2中HDFS的HA主要指的是可以同時啟動2個NameNode。其中一個處於工作(Active)狀態,另一個處於隨時待命(Standby)狀態。這樣,當一個NameNode所在的服務器宕機時,可以在數據不丟失的情況下,手工或者自動切換到另一個NameNode提供服務。如圖3所示,它展示了一個在Hadoop2下實現HA的一種方式結構:

技術分享

圖3 Hadoop2.x時代實現HA的一種架構圖

  下面對上圖做一下簡單的介紹:

  (1)這些NameNode之間通過共享存儲同步edits信息,保證數據的狀態一致。多個NameNode之間共享數據,可以通過Network File System(NFS)或者Quorum Journal Node。前者是通過Linux共享的文件系統,屬於操作系統層面的配置;後者是Hadoop自身的東西,屬於軟件層面的配置。

  (2)DataNode同時向兩個NameNode匯報塊信息。這是讓Standby NameNode保持集群最新狀態的必需步驟。

  (3)使用Zookeeper來進行心跳監測監控,在Active NameNode失效時自動切換Standby NameNode為Active狀態。

二、MapReduce的改進

2.1 Hadoop1.x時代的MapReduce

  在Hadoop1.x時代,Hadoop中的MapReduce實現是做了很多的事情,而該框架的核心Job Tracker則是既當爹又當媽的意思,如圖4所示:

技術分享

  圖4 Hadoop1.x時代的MapReduce框架架構圖

  (1)首先用戶程序 (JobClient) 提交了一個 job,job 的信息會發送到 Job Tracker 中,Job Tracker 是 Map-reduce 框架的中心,他需要與集群中的機器定時通信 (heartbeat), 需要管理哪些程序應該跑在哪些機器上,需要管理所有 job 失敗、重啟等操作。

  (2)TaskTracker 是 Map-reduce 集群中每臺機器都有的一個部分,他做的事情主要是監視自己所在機器的資源情況。

  (3)TaskTracker 同時監視當前機器的 tasks 運行狀況。TaskTracker 需要把這些信息通過 heartbeat發送給JobTracker,JobTracker 會搜集這些信息以給新提交的 job 分配運行在哪些機器上。

Hadoop1.x的MapReduce框架的主要局限:

(1)JobTracker 是 Map-reduce 的集中處理點,存在單點故障

(2)JobTracker 完成了太多的任務,造成了過多的資源消耗,當 map-reduce job 非常多的時候,會造成很大的內存開銷,潛在來說,也增加了 JobTracker 失效的風險,這也是業界普遍總結出老 Hadoop 的 Map-Reduce 只能支持 4000 節點主機的上限;

2.2 Hadoop2中新方案:YARN+MapReduce

  首先的不要被YARN給迷惑住了,它只是負責資源調度管理。而MapReduce才是負責運算的家夥,所以YARN != MapReduce2.

YARN 並不是下一代MapReduce(MRv2),下一代MapReduce與第一代MapReduce(MRv1)在編程接口、數據處理引擎(MapTask和ReduceTask)是完全一樣的, 可認為MRv2重用了MRv1的這些模塊,不同的是資源管理和作業管理系統,MRv1中資源管理和作業管理均是由JobTracker實現的,集兩個功能於一身,而在MRv2中,將這兩部分分開了。 其中,作業管理由ApplicationMaster實現,而資源管理由新增系統YARN完成,由於YARN具有通用性,因此YARN也可以作為其他計算框架的資源管理系統,不僅限於MapReduce,也是其他計算框架(例如Spark)的管理平臺。  

技術分享

圖5 Hadoop2時代的新方案架構圖

  從圖5中也可以看出,Hadoop1時代中MapReduce可以說是啥事都幹,而Hadoop2中的MapReduce的話則是專門處理數據分析,而YARN則做為資源管理器而存在。

  該架構將JobTracker中的資源管理及任務生命周期管理(包括定時觸發及監控),拆分成兩個獨立的服務,用於管理全部資源的ResourceManager以及管理每個應用的ApplicationMaster,ResourceManager用於管理向應用程序分配計算資源,每個ApplicationMaster用於管理應用程序、調度以及協調。一個應用程序可以是經典的MapReduce架構中的一個單獨的Job任務,也可以是這些任務的一個DAG(有向無環圖)任務。ResourceManager及每臺機上的NodeManager服務,用於管理那臺主機的用戶進程,形成計算架構。每個應用程序的ApplicationMaster實際上是一個框架具體庫,並負責從ResourceManager中協調資源及與NodeManager(s)協作執行並監控任務。如圖6所示:

技術分享

圖6 YARN架構圖

  (1)ResourceManager包含兩個主要的組件:定時調用器(Scheduler)以及應用管理器(ApplicationManager)。

  ①定時調度器(Scheduler):

  定時調度器負責向應用程序分配資源,它不做監控以及應用程序的狀態跟蹤,並且它不保證會重啟由於應用程序本身或硬件出錯而執行失敗的應用程序。

  ②應用管理器(ApplicationManager):

  應用程序管理器負責接收新任務,協調並提供在ApplicationMaster容器失敗時的重啟功能。

  (2)ApplicationMaster:每個應用程序的ApplicationMaster負責從Scheduler申請資源,以及跟蹤這些資源的使用情況以及任務進度的監控。

  (3)NodeManager:NodeManager是ResourceManager在每臺機器的上代理,負責容器的管理,並監控他們的資源使用情況(cpu,內存,磁盤及網絡等),以及向 ResourceManager/Scheduler提供這些資源使用報告。

參考資料

(1)馮立彬,《Hadoop1與Hadoop2的區別》:http://blog.csdn.net/fenglibing/article/details/32916445

(2)終身赤腳,《Hadoop中MapReduce框架入門》:http://my.oschina.net/codeWatching/blog/345374

(3)吳超,《Hadoop2的重大變化介紹》:http://www.superwu.cn/2013/11/29/854/

(4)董西成,《HDFS Federation的設計動機與原理》:http://dongxicheng.org/mapreduce/hdfs-federation-introduction/

(5)孫振南,《Hadoop2.0 HA和Ferderation實踐》:http://www.infoq.com/cn/articles/hadoop-2-0-namenode-ha-federation-practice-zh/

原文鏈接:http://www.cnblogs.com/edisonchou/

Hadoop學習筆記—21.Hadoop2的改進內容簡介