【转】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

相关文章
相关标签/搜索