【转】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的更多相关文章
- Resource Allocation of Yarn
关键词:yarn 资源分配 mapreduce spark 简要指南 适合不想看太多原理细节直接上手用的人. 基本原则: container分配的内存不等于机器实际用掉的内存.NM给container ...
- YARN - Yet Another Resource Negotiator
http://www.socc2013.org/home/program http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-ya ...
- yarn默认配置
name value description yarn.ipc.client.factory.class Factory to create client IPC classes. yarn.ip ...
- YARN的内存和CPU配置
时间 2015-06-05 00:00:00 JavaChen's Blog 原文 http://blog.javachen.com/2015/06/05/yarn-memory-and-cpu- ...
- 2、HDFS和Yarn的基础学习笔记
日志 --排错 .log:通过log4j记录的,记录大部分应用程序的日志信息 .out:记录标准输出和标准错误日志,少量记录 hdfs 常用shell -ls -put < ...
- yarn资源调度(网络搜集)
本文转自:http://www.itweet.cn/2015/07/24/yarn-resources-manager-allocation/ Hadoop YARN同时支持内存和CPU两种资源的调度 ...
- Spark On Yarn的两种模式yarn-cluster和yarn-client深度剖析
Spark On Yarn的优势 每个Spark executor作为一个YARN容器(container)运行.Spark可以使得多个Tasks在同一个容器(container)里面运行 1. Sp ...
- HAWQ集成Yarn HA作为资源管理服务
一.第一步当然是配置YARN HA,这在使用ambari管理时很简单,这里不在赘述. 二.建立HAWQ的专用资源队列queue 不要手工编辑scheduler设置,最方便的当然是使用queue man ...
- 转载-YARN的内存和CPU配置
Hadoop YARN同时支持内存和CPU两种资源的调度,本文介绍如何配置YARN对内存和CPU的使用. YARN作为一个资源调度器,应该考虑到集群里面每一台机子的计算资源,然后根据applicati ...
随机推荐
- K-匿名算法研究
12月的最后几天,研究了下k匿名算法,在这里总结下. 提出背景 Internet 技术.大容量存储技术的迅猛发 展以及数据共享范围的逐步扩大,数据的自动采集 和发布越来越频繁,信息共享较以前来得更为容 ...
- Python 将中文、字母转成数字
Outline 把中文汉字或者英文字母或者特殊字符转换成数字. (实质是字符转成对应ASCII码) 转换 将中文汉字转成数字: ord('单个中文汉字') 反转: chr(21704) 将英文字母转成 ...
- javascript ~~ 符号是什么意思呢?
~ bitwise NOT 运算符 ~对操作数按位取反,两个的意思即作两次取反操作,其实是等作原数本身(操作数是32整数范围内) ~~(Math.random()*7) 即 var n = Math. ...
- JAVA基础之设置随机成语验证码
package com.oracle; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import ja ...
- ORACLE表、索引和分区详解
ORACLE表.索引和分区 一.数据库表 每种类型的表都有不同的特性,分别应用与不同的领域 堆组织表 聚簇表(共三种) 索引组织表 嵌套表 临时表 外部表和对象表 1.行迁移 建表过程中可以指定以下两 ...
- 英文FRAUNCE法国FRAUNCE单词
France Alternative forms Fraunce In Fraunce, the inhabitants of one city were driven out and forced ...
- 【RAC】rac环境下的数据库备份与还原
[RAC]rac环境下的数据库备份与还原 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~ ...
- JVM中的类加载
JVM中的类加载 关于JVM中类的加载这部分知识在网上有太多的文章描述这部分的知识.但是多数文章都过于冗长,难以理解.这篇文章主要是一些我对JVM中类的加载的理解. 一.一句话概括 java在类加载的 ...
- Apache Flink 零基础入门(转)
这是一份很好的 Apache Flink 零基础入门教程. Apache Flink 零基础入门(一&二):基础概念解析 Apache Flink 零基础入门(三):开发环境搭建和应用的配置. ...
- App抓包代理设置
1.设置Fiddler 打开Fiddler,Tools --> Fiddler Options --> HTPS (配置完后记得要重启Fiddler) 选中"Decrpt ...