YARN 初識

Apache YARN (Yet Another Resource Negotiator,另一個資源協調者)是Hadoop的集羣資源管理系統,它從Hadoop 2.0版本開始被引入,主要是爲了改進MapReduce的實現,可以很好地支持其它的分佈式計算模式。

YARN提供了請求和使用集羣資源的API,但這些API通常不能由用戶代碼直接使用,而是使用由分佈式集羣框架提供的更高級的API,這些框架構建在YARN上,並對用戶隱藏了資源管理的細節,如下圖所示,它展示了一些分佈式計算框架(MapReduce、Spark等等)作爲YARN 應用運行在集羣計算層(YARN)和存儲層(HDFS 和 HBase)上。


當然也有其它的應用層是構建在上圖架構之上的,比如Pig,Hive和Crunch等是構建在MapReduce、Spark、Tez之上的,但是它們不直接與YARN交互。

解剖YARN應用的運行機制

YARN提供的核心服務是通過兩個長時間運行的守護進程:resource manager(資源管理器),每個集羣中只有一個,主要負責管理集羣中使用的資源,另一個是node managers(節點管理器)運行在集羣中每個節點上,主要負責啓動和監控container(容器),container是用一套有限的資源(內存、CPU等)來執行特定應用的進程,這要看YARN怎麼配置了,一個container也許是一個Unix進程或是一個Linux cgroup。

下圖展示了YARN是怎樣運行的:


在YARN上運行一個應用,客戶端需要聯繫resource manager並請求運行一個application master進程(圖中的第一步),然後resource manager尋找一個node manager,它可以在其container中啓動application master(圖中2a和2b)。一旦application master啓動起來,它做什麼取決於具體的應用,它可以在container做一些簡單的計算,然後把結果返還給客戶端。或者它可以向resource manager請求更多的container(第3步),並用它們運行一個分佈式計算(圖中4a和4b)。

從圖中看到,YARN沒有爲應用的各個部分(client, master, process)提供任何方式進行相互通信。實際YARN是用遠程調用的形式(比如Hadoop的RPC層)來傳遞狀態更新和結果返回給客戶端。

Resource Requests

YARN處理資源請求有一個靈活的模型,對一組container的請求可以表達爲每個container需要的計算機資源數量(內存和CPU),以及對container的局部約束。

局部性可以確保分佈式數據處理算法有效的使用集羣的帶寬,所以,YARN允許一個應用對它請求的container指定局部性約束。局部性約束可以應用到集羣中任何一個container,包括同一個機架或不同機架上的節點上的container。

有時,局部性約束不能得到滿足,在這種情況下,無論是否分配,約束是可以選擇、放寬的。例如,如果請求的節點不能啓動一個container(因爲它正在運行其他的container),YARN將會試着在同一個機架的節點上啓動一個container,如果還不行,那就在集羣中的任何一個節點上啓動。

一般情況下,啓動一個container去處理HDFS塊(比如,運行一個map task),應用將在該塊的3個副本中的其中一個節點上來請求一個container,有可能是同一個機架上的節點,也可能是集羣中的任何一個。

Application Lifespan

YARN應用的生命週期可以有較大的不同:從運行幾秒鐘的“短命”應用到運行幾天甚至幾個月的長期應用。可以從應用的生命週期來對應用分類:首先,最簡單情況是一個用戶job對應一個應用,這通常是MapReduce採用的方法。

第二種爲每個工作流或用戶回話的多個job(可能不相關)運行一個應用,這種方式比第一種更高效,因爲container可以在不同的job中重用,並且在不同的job間也有可能緩存中間的數據。

第三種爲對於長期運行的應用可以在不同的用戶間共享,這樣的應用通常是起到某種協調作用的角色。例如,Apache Slider有一個長期運行的主應用負責啓動集羣中其它的應用。

Building YARN Applications

從零開始寫一個YARN應用是相當複雜的,但是在大多數情況下是不需要的,因爲往往可能使用一個現存的應用。例如,你需要運行一個有向無環圖(DAG: directed acyclic graph)的job,那麼可以用Spark或Tez。

YARN Compared to MapReduce 1

在Hadoop最初版本(版本1或更早)的MapReduce分佈式實現,有時會被稱作“MapReduce 1”,主要是爲了和”MapReduce 2“區分開來,MapReduce 2是使用YARN來實現的。

在MapReduce1,中,有兩中類型的守護進程控制着job的執行過程:一個job tracker和一個或多個task tracker。job tracker負責協調系統中所有的job,通過調度task任務,在task tracker節點上執行。task tracker負責執行job tracker分配給它的任務,並向job tracker節點發送處理報告,這記錄了每個job的整體執行情況。如果一個task失敗,job tracker會在不同的task tracker節點上重新調度它。

在MapReduce1中, job tracker同時負責job的調度和任務進度的監控(跟蹤任務、重啓失敗或運行緩慢的task和做任務的記錄,比如維護計數器的總數)。相比之下,YARN的這些責任是由單個的實體處理:資源管理器(resource manager)和一個主應用程序(application master,每個MapReduce job都有一個)。MapReduce1的 job tracker也負責存儲已完成任務的歷史記錄,雖然有可能運行一個job歷史服務器,作爲一個守護進程去加載關閉的job tracker。對於YARN來說,等效的角色是時間軸服務器(timline server),它存儲着應用的歷史記錄。

YARN中和task tracker等效的是node manager。MapReduce1和YARN的映射,如下圖:


YARN被設計用來解決MapReduce1許多限制的問題。主要有以下幾個方面的好處:

  • 可擴展性(Scalability):相比MapReduce1,YARN可以運行一個更大的集羣。MapReduce1 運行4000節點和40000個task就遇到了擴展性的瓶頸,這主要是因爲job tracker要同時管理job和task。YARN克服了這些限制,憑藉其分割resource manager / application master的架構,它可以擴展到10000個節點和100000個task。
    相比於job tracker,YARN 應用的每個實例(這裏爲MapReduce job)都有一個專用的application master。這種模式接近於Google原始的MapReduce論文,它描述了一個主進程是怎樣協調集羣中的工作節點運行map和reduce任務的。
  • 可用性(Availability):高可用(HA:High Availability)通常是指在當前服務進程失敗的情況下,通過複製所需的狀態給另一個守護進程來接管提供服務的任務。然而,對於job tracker來說,在job tracker的內存中,大量迅速變化的複雜狀態(例如,每隔幾秒更新task的狀態)來實現HA是很困難的。
    在YARN中,通過使用resource manager和application master來拆分job tracker的職責,使HA成爲一個分而治之的問題:分擔給resource manager和每一個YARN application。
  • 利用率(Utilization): 在MapReduce1中,每個tasktracker在配置時被靜態分配爲固定大小的“槽(slots)”,它又被分爲多個map槽和多個reduce槽。一個map槽只能運行map task,一個reduce槽只能運行reduce task。
    在YARN中,一個node manager管理一個資源池,而不是固定數量的特定的“槽”。在YARN運行MapReduce,不會遇到像MapReduce1那樣僅因爲只有map槽可用,而reduce任務必須等待的情況,如果運行task的資源可用,則應用會將可用的資源分配給他們。
    此外,YARN中資源是細粒度的,可以滿足應用的每個請求,而不是每個固定的槽。
  • 多租戶(Multitenancy): 多租戶技術(multi-tenancy technology)或稱多重租賃技術,是一種軟件架構技術,它是在探討與實現如何於多用戶的環境下共用相同的系統或程序組件,並且仍可確保各用戶間數據的隔離性。
    在多租戶技術中,租戶(tenant)是指使用系統或電腦運算資源的客戶,但在多租戶技術中,租戶包含在系統中可識別爲指定用戶的一切數據,舉凡帳戶與統計信息(accounting data),用戶在系統中建置的各式數據,以及用戶本身的客製化應用程序環境等,都屬於租戶的範圍,而租戶所使用的則是基於供應商所開發或建置的應用系統或運算資源等,供應商所設計的應用系統會容納數個以上的用戶在同一個環境下使用,爲了要讓多個用戶的環境能力同一個應用程序與運算環境上使用,則應用程序與運算環境必須要特別設計,除了可以讓系統平臺可以允許同時讓多份相同的應用程序運行外,保護租戶數據的隱私與安全也是多租戶技術的關鍵之一。
    多租戶技術的實現重點,在於不同租戶間應用程序環境的隔離(application context isolation)以及數據的隔離(data isolation),以維持不同租戶間應用程序不會相互干擾,同時數據的保密性也夠強。

    在某些方面,YARN的最大好處是它開闢了Hadoop MapReduce之外的其它分佈式應用。MapReduce只是衆多YARN應用中的一個。
    在同一個AYRN集羣中,可以運行不同版本的MapReduce,這使得升級MapReduce會更容易。

YARN 調度器

在理想狀態下,對YARN應用的請求將會被立即處理,然而,在實際情況下,資源是有限的,並且在繁忙的集羣中,一個應用常常需要等待某些請求完成。YARN調度器的工作就是根據一些定義好的策略來爲應用分配資源。調度一般是一個難題並且沒有最好的策略,這就是爲什麼YARN要提供調度器的可選和可配置的策略。

Scheduler Options

在YARN中有三種調度器:FIFO、容量(Capacity)、公平調度器(Fair Schedule)。FIFO調度器是按應用提交到隊列的先後順序來調度的,一旦一個請求得到處理,下一個應用將接受後續的請求。FIFO調度器簡單易理解並且不需要任何配置,但是它不適合用於共享集羣,因爲大型應用將會使用集羣中所有的資源,每個應用必須等待直到輪到它。

對於共享集羣最好使用Capacity Schedule和Fair Schedule,它們能讓運行時間較長的job能夠及時完成,並且用戶能夠運行併發較小的即席查詢(ad hoc queries),在一個合理的時間內得到結果。

對於Capacity Schedule,每個一個job都有一個專用的隊列,小的job可以立即得到運行。因爲需要爲每個job保留capacity,所以這將降低集羣的利用率,也意味着運行大job的完成時間要晚於使用FIFO調度器的時間。

對於Fair 調度器,他不需要保留固定數量的容量(capacity),因爲它會在運行的job間動態平衡資源。當第一個job(較大)啓動時,僅有該job在運行,所以它會得到集羣中所有的資源,當第二個job(較小)啓動時,它會得到集羣中一半的資源。所以每個job都在使用公平份額的資源。

值得注意的是在第二個job啓動到它接收到資源會有一段時間的延遲,因爲它需要等待第一個佔用全部資源的job釋放資源。小的job運行完成並且不再需要資源,大的job將會再次得到集羣中的所有資源。整體效果是高的集羣使用率和能夠及時完成小的job。

下圖顯示了這三種調度器的差異:





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