深入理解 YARN Resource Localization

2024-05-02 07:38

本文主要是介绍深入理解 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来说,本地资源指:

  • 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地址,用来接收不同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时,可以被删除。

参考

  • Management of Application Dependencies in YARN

  • Resource Localization in YARN: Deep Dive

本文转载自 http://bigdatadecode.club/YARN-Resource-Localization.html

Flink 从入门到精通 系列文章
基于 Apache Flink 的实时监控告警系统关于数据中台的深度思考与总结(干干货)日志收集Agent,阴暗潮湿的地底世界

公众号(zhisheng)里回复 面经、ClickHouse、ES、Flink、 Spring、Java、Kafka、监控 等关键字可以查看更多关键字对应的文章。
点个赞+在看,少个 bug ????

这篇关于深入理解 YARN Resource Localization的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/953733

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

分布式系统的个人理解小结

分布式系统:分的微小服务,以小而独立的业务为单位,形成子系统。 然后分布式系统中需要有统一的调用,形成大的聚合服务。 同时,微服务群,需要有交流(通讯,注册中心,同步,异步),有管理(监控,调度)。 对外服务,需要有控制的对外开发,安全网关。