转Resource Localization in YARN
Posted piperck
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转Resource Localization in YARN相关的知识,希望对你有一定的参考价值。
一个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来说,本地资源指:
- 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必须是只读的。
下面举几个比较适合做本地资源的典型例子:
- container启动的时候需要的代码库,如jar文件
- container启动时所需要的configure文件
- 静态的文件目录
一些动态资源不适合作为本地资源,例如: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类型是指普通的文件,文本类型或者二进制文件
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地址,用来接收不同localizersyarn.nodemanager.localizer.client.thread-count
: ResourceLocalizationService中用来处理来自localizers请求的线程数。默认是5yarn.nodemanager.localizer.fetch.thread-count
: 本地化PUBLIC资源时PublicLocalizer的线程数。默认是4yarn.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
以上是关于转Resource Localization in YARN的主要内容,如果未能解决你的问题,请参考以下文章
Discriminative LocalizationLearning Deep Features for Discriminative Localization 论文解析(转)
论文阅读(Weilin Huang——arXiv2016Accurate Text Localization in Natural Image with Cascaded Convolutiona
泡泡一分钟:A Multi-Position Joint Particle Filtering Method for Vehicle Localization in Urban Area
How do I duplicate a resource reference in code behind in WPF?