【轉】Resource Localization in YARN

一個Applciation運行在YARN上的流程爲,從YARN Client向ResourceManager提交任務,將Applciation所需資源提交到HDFS中,而後ResourceManager啓動APPMaster,APPMaster通知各個NodeManager啓動container執行具體到計算任務。在啓動container以前須要從HDFS上下載該container執行所依賴的資源,這些資源包括jar、依賴的jar或者其它文件,這個過程就稱爲資源本地化(Resource Localization)。html

本篇主要介紹下資源本地化相關的內容。node

相關概念

本地化(Localization)
本地化是指將HDFS上的資源下載到本地的過程。將資源本地化,使container不用老是訪問HDFS上的數據,而是直接訪問本地數據,提升效率。安全

本地資源(LocalResource)
本地資源是指container運行時所須要的資源,能夠是某個文件或者依賴的library,這些資源存在HDFS中。NodeManager在container啓動以前負責將這些資源進行本地化。對於Application來講,本地資源指:app

  • URL: 須要從HDFS上下載的本地資源地址
  • Size: 本地資源的大小
  • timestamp: 本地資源在HDFS上建立時的時間戳
  • LocalResourceType: NodeManager本地化資源時指定的資源類型,有FILE、ARCHIVE和PATTERN
  • Pattern: 從archive中解壓具體內容時使用的規則匹配方式(只有LocalResourceType是PATTERN時才生效)。
  • LocalResourceVisibility: NodeManager將資源本地化以後針對該Nodemanager上其它用戶和Application的可見性。可見範圍爲PUBLIC、PRIVATE和APPLICATION。

NOTE: 本地資源並非指在本地磁盤的資源,而是須要從HDFS下載到本地的資源。負載均衡

那麼container會請求什麼樣的資源進行本地化呢?能夠是任意的文件,可是這些文件對contianer必須是隻讀的。
下面舉幾個比較適合作本地資源的典型例子:fetch

  1. container啓動的時候須要的代碼庫,如jar文件
  2. container啓動時所須要的configure文件
  3. 靜態的文件目錄

一些動態資源不適合做爲本地資源,例如:container須要的資源有可能被其它組件進行更新,application本身會直接更新的文件或者application想跟其它服務共享文件的變化狀況的。線程

ResourceLocalizationService
ResourceLocalizationService是NodeManager內部的一個服務,主要負責下載和管理container所需的各類資源。下載時會對全部可用的磁盤進行負載均衡,對下載的資源會嚴格控制他們的訪問權限。code

DeletionService
DeletionService也是NodeManager內部的一個服務,主要負責在收到指令以後刪除本地目錄xml

Localizer
Localizer其實是一個線程,用於資源本地化。Localizer有兩種類型,一種是指用與下載PUBLIC訪問類型資源的PublicLocalizer,另外一種是下載PRIVATE和APPLICATION訪問類型的ContainerLocalizershtm

LocalCache
LocalCache是NodeManager維護全部下載到本地的文件的local-cache。這些資源經過下載時指定的HDFS地址來惟一標識。

概念補充

LOCALRESOURCE TIMESTAMPS

timestamp反應了本地資源的一個版本,NodeManager在下載本地資源時會檢查timestamp,這樣Application在運行時看到的文件內容都同樣。
利用timestamp,YARN能發現資源是否發生過變化,若是發生變化將使container失敗避免不一致發生。由於在HDFS上的資源一旦被NodeManager本地化到本地磁盤,這個文件就再也不與源文件有任何聯繫,只會記錄下原來的URL用來在本地進行惟一標識。此時即便源文件發生變化,NodeManager也不會跟蹤此變化再次下載文件。

這裏須要注意的是當container啓動時,ApplicationMaster會向運行container的NodeManager指定資源的timestamp,一樣當運行ApplicationMaster的container啓動時,也須要資源的timestamp,此時這個timestamp就須要由client指定。以MapReduce on YARN爲例,MapReduce的JobClient決定ApplicationMaster須要的資源的timestamp,而後由ApplicationMaster本身決定map和reduce所需資源的timestamp。

LOCALRESOURCE TYPES

上一節中提到LocalResourceType爲FILE、ARCHIVE和PATTERN,下面介紹下三種type的具體含義。
FILE類型是指普通的文件,文本類型或者二進制文件
ARCHIVE類型是指一些能夠被NodeManager自動識別解壓的歸檔文件,好比jars、tars、tar.gz和zip
PATTERN是ARCHIVE和FILE的一種混合體。這種類型下載到本地的源文件會保留,而且在本地化時只有解壓的文件會留存在本地文件系統中。源文件和解壓的文件在同一個目錄中。哪些文件須要從ARCHIVE中抽取出來,哪些不須要這些都是由pattern決定的。目前只有jar支持PATTERN,其它都被認爲正常的ARCHIVE。

 

LOCALRESOURCE VISIBILITES

上一節LocalResourceVisibility中提到本地資源有三種可見性,分別爲PUBLIC、PRIVATE和APPLICATION。其中

PUBLIC的訪問權限是指任何用戶的任意Application的container均可以訪問。典型的PUBLIC資源是那些在HDFS上能夠被任何人訪問的文件,當這些資源被本地化以後會保留相同的訪問權限。若是一個資源是PUBLIC,當有container(container能夠是當前Attempt,也能夠是其它用戶的任意Application中的container)請求相同的本地資源時,只要此資源沒有被LocalCache刪除,均可以直接從LocalCache裏直接使用,而不須要再次下載

PUBLIC資源存儲在NodeManager本地磁盤的<local-dir>/filecache目錄下,此目錄中的全部文件的owner是NodeManager進程啓動時的用戶,而且全部用戶都有讀權限,所以這些資源能夠在此NodeManager上運行的全部用戶的container共享。

PRIVATE權限本地資源只能在當前節點上相同用戶的application之間共享,這些資源存儲在NodeManager本地磁盤的<local-dir>/usercache/$username/filecache目錄下,這些文件的owner是啓動Application的user,而且其它用戶沒有訪問權限。相似PUBLIC,一旦資源本地化,全部的用戶都沒有寫權限,即便是提交任務的user。這樣是爲了不惡意的container去修改文件。

APPLICATION只在當前節點上同一個application的container之間共享。這些資源存儲在NodeManager本地磁盤的<local-dir>/usercache/$username/appcache/<app-id>/目錄下,文件的owner是Application的提交者,而且只有讀權限。

這裏須要注意的是LOCALRESOURCE VISIBILITIES與LOCALRESOURCE TIMESTAMPS相似,都是由ApplicationMaster指定本地資源的可見性,NodeManager並不會對資源的可見性作任何決定。一樣當運行ApplicationMaster的container啓動時,也須要資源的可見性,此時這個可見性就須要由client指定。以MapReduce on YARN爲例,MapReduce的JobClient決定ApplicationMaster須要的資源的可見性,而後由ApplicationMaster本身決定map和reduce所需資源的可見性。

本地化流程

PUBLIC資源本地化是由PublicLocalizer實現的,在NodeManager進程中會有一個線程池PublicLocalizers,其個數是由yarn.nodemanager.localizer.fetch.thread-count決定,線程池的大小決定並行下載PUBLIC資源的線程最大個數。當PublicLocalizer本地化PUBLIC資源時,會經過檢查這些資源在HDFS上的權限來肯定所申請的資源確實爲PUBLIC。只要有資源不符合就拒絕本地化。PublicLocalizer能安全的從HDFS上下載資源是向ContainerLaunchContext傳遞了證書。

PRIVATE/APPLICATON資源的本地化是由ContainerLocalizer實現的,不一樣與PUBLIC的PublicLocalizer實現。PublicLocalizer是直接在NodeManager中啓動一個線程池進行本地化,而ContainerLocalizer出於安全問題,並無在NodeManager進程中直接實現,而是在continer中實現的

PRIVATE/APPLICATON資源的本地化是由ContainerLocalizer實現,這是一個單獨的進程,這個進程由LocalizerRunner線程管理,LocalizerRunner是NodeManager中的一個線程,只要某個container有資源尚未下載,那麼此container就會觸發一個LocalizerRunner。下面看下具體的細節:

當某個container第一次請求PRIVATE/APPLICATION類型的本地資源時,若是沒有在LocalResourcesTracker中找到,則加入pending-resources列表。隨後是否須要建立LocalizerRunner線程取決因而否有必要下載資源,若是須要就將本地資源加入LocalizerRunner維護的pending-resources列表。

NodeManager在安全模式時,本地資源本地化時須要所用的user是application的提交用戶而不是NodeManager的啓動用戶。所以LocalizerRunner會以application提交者的身份啓動LinuxContainerExecutor(LCE)進程,而後LCE會執行ContainerLocalizer下載資源ContainerLocalizer啓動以後會與NodeManager維持一個心跳,經過心跳,LocalizerRunner給ContainerLocalizer分配須要下載的資源或者中止ContainerLocalizer進程,而ContainerLocalizer會通知LocalizerRunner本身的下載進度。若是資源下載失敗,這個資源將會從LocalResourcesTracker中移除,而且container最終也會失敗。若是下載成功,LocalizerRunner會經過心跳給ContainerLocalizer另外一個資源進行下載,直到全部的資源都下載完。

本地資源的生命週期

因爲本地資源的訪問權限不同,則不一樣的LocalResourceType在本地保留的時間也會不同。

  • PUBLIC因爲是在任何用戶的任意Application之間共享,因此並不會在某個container或者application結束以後被刪除,只有在本地目錄達到存儲閾值時纔會被刪除,這個閾值由yarn.nodemanager.localizer.cache.target-size-mb控制。
  • PRIVATE和PUBLIC的生命週期同樣。
  • APPLICATION會在application結束以後當即刪除。

本地化相關的配置

yarn-site.xml中有一些資源本地化相關的配置。

  • yarn.nodemanager.local-dirs: 資源本地化時所在的本地目錄,能夠是以逗號分隔的多個磁盤目錄。
  • yarn.nodemanager.local-cache.max-files-per-directory: 每一個目錄中最多本地化文件的個數,PUBLIC / PRIVATE / APPLICATION分別統計。
  • yarn.nodemanager.localizer.address: ResourceLocalizationService服務監聽的RPC地址,用來接收不一樣localizers
  • yarn.nodemanager.localizer.client.thread-count: ResourceLocalizationService中用來處理來自localizers請求的線程數。默認是5
  • yarn.nodemanager.localizer.fetch.thread-count: 本地化PUBLIC資源時PublicLocalizer的線程數。默認是4
  • yarn.nodemanager.delete.thread-count: DeletionService中刪除文件的線程數,默認是4。
  • yarn.nodemanager.localizer.cache.target-size-mb: 本地化資源所佔的最大磁盤空間,單位是MB,比包括APPLICATION資源。
  • yarn.nodemanager.localizer.cache.cleanup.interval-ms: 每隔固定時間,去檢查下磁盤的使用量。在此間隔以後,若是存儲的磁盤空間超過了配置的閾值,會刪除未用的資源。

未使用的資源是指沒有被正在運行的container引用的資源。每次container請求資源時,container會被加入到一個資源引用列表中,直到container結束以後纔會被移除。因此當引用數爲0時,能夠被刪除。

 

 

Reference:

http://bigdatadecode.club/YARN-Resource-Localization.html

https://zh.hortonworks.com/blog/management-of-application-dependencies-in-yarn/  Management of Application Dependencies in YARN
https://zh.hortonworks.com/blog/resource-localization-in-yarn-deep-dive/  Resource Localization in YARN: Deep Dive

https://stackoverflow.com/questions/32082723/make-yarn-clean-up-appcache-before-retry/42938399  Make YARN clean up appcache before retry

相關文章
相關標籤/搜索