深入理解 YARN Resource Localization

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

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

相關概念

本地化 (Localization)

本地化是指將 HDFS 上的資源下載到本地的過程。將資源本地化,使 container 不用總是訪問 HDFS 上的數據,而是直接訪問本地數據,提高效率。

本地資源 (LocalResource)

本地資源是指 container 運行時所需要的資源,可以是某個文件或者依賴的 library,這些資源存在 HDFS 中。NodeManager 在 container 啓動之前負責將這些資源進行本地化。對於 Application 來說,本地資源指:

NOTE: 本地資源並不是指在本地磁盤的資源,而是需要從 HDFS 下載到本地的資源。

那麼 container 會請求什麼樣的資源進行本地化呢?可以是任意的文件,但是這些文件對 contianer 必須是隻讀的。

下面舉幾個比較適合做本地資源的典型例子:

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

ResourceLocalizationService

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

DeletionService

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

Localizer

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

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 類型是指普通的文件,文本類型或者二進制文件

LOCALRESOURCE VISIBILITES

上一節 LocalResourceVisibility 中提到本地資源有三種可見性,分別爲 PUBLIC、PRIVATE 和 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 在本地保留的時間也會不一樣。

本地化相關的配置

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

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

參考

本文轉載自 http://bigdatadecode.club/YARN-Resource-Localization.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/hsz3ILDdtj7RhST9X407Xg