NodeManager中分布式缓存机制

分布式缓存介绍

       在Yarn中,分布式缓存是一种分布式文件分发与缓存机制,类似于MRv1中的Distrubuted Cache,其主要作用就是将用户应用程序执行时所需的外部文件资源自动透明的下载缓存到各个节点,从而省去了用户手动部署这些文件麻烦。
YARN分布式缓存工作流程如下:

  1. 客户端将应用程序所需的文件资源(外部字典、JAR包、二进制文件)提交到HDFS上。
  2. 客户端将应用程序提交到RM上。
  3. RM将与某个NM进行通信,启动应用程序AM,NM收到命令后,首先从HDFS上下载文件(缓存),然后启动AM。
  4. AM与RM通信,以请求和获取计算资源。
  5. AM收到新分配到的计算资源后,与对应的NM通信,以启动任务。
  6. 如果应用程序第一次在该节点上启动任务,NM首先从HDFS上下载文件缓存到本地,然后启动任务。
  7. NM后续收到启动任务请求后,如果文件已在本地缓存,则直接执行任务,否则等待文件缓存完成后再启动。

各个节点上的缓存文件由对应的NM管理和维护。在Hadoop中,分布式缓存并不是将文件缓存到集群中各个节点的内存中,而是将文件缓存到各个节点的磁盘上,以便执行任务时直接从磁盘上读取文件。

资源可见性和分类

       分布式缓存机制是由各个NM实现的,主要功能是将应用程序所需的文件资源缓存到本地,以便后续任务的使用,资源缓存是用时触发的,也就是第一个用到该资源的任务触发,后续任务无需再进行缓存,直接使用即可;
根据可见性,NM将资源分为三类:

  1. Public:节点上所有的用户都可以共享该资源,只要有一个用户的应用程序将着这些资源缓存到本地,其他所有用户的所有应用程序都可以使用;
  2. Private:节点上同一用户的所有应用程序共享该资源,只要该用户其中一个应用程序将资源缓存到本地,该用户的所有应用程序都可以使用;
  3. Application:节点上同一应用程序的所有Container共享该资源;

根据资源类型,NM向资源分为三类:

  1. archive:归档文件,支持.jar、.zip、.tar.gz、.tgz、.tar的5种归档文件;
  2. file:普通文件,NM只是将这类文件下载到本地目录,不做任何处理;
  3. pattern:以上两种文件的混合体;

       YARN是通过比较resource、type、timestamp和pattern四个字段是否相同来判断两个资源请求是否相同的。如果一个已经被缓存到各个节点上的文件被用户修改了,则下次使用时会自动触发一次缓存更新,以重新从HDFS上下载文件。
       分布式缓存完成的主要功能是文件下载,涉及大量的磁盘读写,因此整个过程采用了异步并发模型加快文件下载速度,以避免同步模型带来的性能开销。

分布式缓存实现

       NodeManager采用轮询的分配策略将这三类资源存放在yarn.nodemanager.local-dirs指定的目录列表中,在每个目录中,资源按照以下方式存放:

  1. PUBLIC资源:存放在${yarn.nodemanager.local-dirs}/filecache/目录下,每个资源将单独存放在以一个随机整数命名的目录中,且目录的访问权限均为0755。
  2. PRIVATE资源:存放在${yarn.nodemanager.local-dirs}/usercache/${user}/filecache/目录下,(其中${user}是应用程序提交者,默认情况下,均为NodeManager启动者),每个资源将单独存放在以一个随机整数命名的目录中,且目录的访问权限均为0710。
  3. APPLICATION资源:存放在${yarn.nodemanager.local-dirs}/usercache/${user}/${appcache}/${appid}/filecache/目录下(其中${appid}是应用程序ID),每个资源将单独存放在以一个随机整数命名的目录中,且目录的访问权限均为0710;

其中Container的工作目录位于${yarn.nodemanager.local-dirs}/usercache/${user}/${appcache}/${appid}/${containerid}目录下,其主要保存jar包文件、字典文件对应的软链接。

其根据不同的可见性实现的缓存机制如下:

  • 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中实现的。并且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另一个资源进行下载,直到所有的资源都下载完。

       最后,NodeManager为了避免缓存的文件过多导致磁盘“撑爆”,其会定期清理过期的缓存文件,具体方法如下:每隔一定时间yarn.nodemanager.localizer.cache.cleanup.interval-ms(单位是毫秒,默认值是10×60×1000,即10分钟)启动一次清理工作,确保每个缓存目录中文件容量小于yarn.nodemanager.localizer.cache.target-size-mb(单位是MB,默认是10240,即10GB),如果超过该值,则采用LRU(Least Recently Used)算法清除已不再使用的缓存文件,直至文件容量低于设定值。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: HadoopNodeManager是指在每个节点上运行的守护程序,用于管理该节点上的资源。它负责接收来自ResourceManager的任务请求,启动任务的执行,监控任务的进度,并将任务执行的状态报告回ResourceManager。同时,它还负责跟踪该节点上的可用资源,并定期向ResourceManager发送有关该节点上可用资源的信息,以帮助ResourceManager更好地调度任务。NodeManagerHadoop集群非常重要的组件之一,它的良好运行状态对于整个集群的稳定性和性能都至关重要。 ### 回答2: HadoopNodeManager(节点管理器)是Hadoop YARN(Yet Another Resource Negotiator)架构的一部分,负责管理集群的节点和资源。它运行在每个工作节点上,并负责执行和监控容器(container)。 NodeManager的主要功能是与资源管理器(ResourceManager)通信,以便协调节点上的资源分配和任务启动。它会周期性地向资源管理器报告节点的健康状态和可用资源,并接收来自资源管理器的任务分配请求。资源管理器通过策略进行节点和资源的分配,并将任务分配给NodeManager来执行。NodeManager负责启动和停止容器,每个容器代表一个正在运行的应用程序或任务。 NodeManager还负责监控容器的运行状态和资源使用情况。它会定期向资源管理器发送心跳,以确认节点的健康状态,并汇报容器的运行状况和资源使用情况。如果容器发生故障或超出资源限制,NodeManager会终止它,并告知资源管理器重新分配任务。 此外,NodeManager还负责本地化和分发应用程序的资源。它从文件系统获取应用程序的依赖文件,并将它们本地化到节点的本地文件系统。这样,应用程序可以在本地资源上高效地运行,而不需要远程访问文件系统。 总之,NodeManagerHadoop集群起着重要的作用。它管理节点上的资源和容器,并通过与资源管理器的通信来协调任务的分配和执行。NodeManager还负责监控和维护容器的运行状态和资源使用情况,以确保集群的稳定和高效运行。 ### 回答3: HadoopNodeManagerHadoop集群的一个组件,负责在每台计算机节点上管理和监控计算资源的使用情况。 NodeManager主要有以下几个功能: 1. 资源管理:NodeManager负责管理每台节点上的计算资源,包括CPU、内存和磁盘空间等。它会实时监测资源的使用情况,并根据需要进行分配和回收。通过资源管理,NodeManager可以避免资源过度利用或浪费的问题,保证集群内的资源利用效率最大化。 2. 任务监控:NodeManager监控运行在节点上的任务的执行情况。它会记录任务的开始和结束的时间,并收集任务的运行日志和报告任务进度。NodeManager与其他Hadoop组件如ResourceManager和ApplicationMaster进行通信,及时更新任务的状态信息。 3. 节点健康检查:NodeManager会定期进行节点的健康检查,包括检查节点是否正常运行、硬件设备是否正常工作等。如果节点出现故障或不可用,NodeManager会及时向ResourceManager汇报,并将故障节点从可用节点列表删除。 4. 安全性管理:NodeManager在管理计算资源的同时,也负责安全性管理。它会验证用户提交的任务的身份和权限,并确保只有经过授权的用户才能访问资源。NodeManager会与Hadoop的安全组件如Kerberos进行集成,提供完善的安全管理。 总之,NodeManagerHadoop集群一个关键的组件,它负责管理和监控每台节点上的计算资源,保障集群的高效运行和任务的顺利执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值