乐趣区

关于hadoop:深入浅出-Yarn-架构与实现63-NodeManager-分布式缓存

不要跳过这部分常识,对理解 NodeManager 本地目录构造,和相熟 Container 启动流程有帮忙。

一、分布式缓存介绍

次要作用就是将用户应用程序执行时,所需的内部文件资源下载缓存到各个节点。
YARN 分布式缓存工作流程如下:

  1. 客户端将应用程序所需的文件资源 (内部字典、JAR 包、二进制文件) 提交到 HDFS 上。
  2. 客户端将应用程序提交到 RM 上。
  3. RM 将与某个 NM 进行通信,启动应用程序 AM,NM 收到命令后,首先从 HDFS 上下载文件 (缓存),而后启动 AM。
  4. AM 与 RM 通信,以申请和获取计算资源。
  5. AM 收到新调配到的计算资源后,与对应的 NM 通信,以启动工作。
  6. 如果应用程序第一次在该节点上启动工作,NM 首先从 HDFS 上下载文件缓存到本地,而后启动工作。
  7. NM 后续收到启动工作申请后,如果文件已在本地缓存,则间接执行工作,否则期待文件缓存实现后再启动。
  8. 各个节点上的缓存文件由对应的 NM 治理和保护。在 Hadoop 中,分布式缓存并不是将文件缓存到集群中各个节点的内存中,而是将文件缓存到各个节点的磁盘上,以便执行工作时间接从磁盘上读取文件。

二、个性介绍

一)资源可见性和分类

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

  • Public:节点上所有的用户都能够共享该资源,只有有一个用户的应用程序将着这些资源缓存到本地,其余所有用户的所有应用程序都能够应用;
  • Private:节点上同一用户的所有应用程序共享该资源,只有该用户其中一个应用程序将资源缓存到本地,该用户的所有应用程序都能够应用;
  • Application:节点上同一应用程序的所有 Container 共享该资源。

YARN 是通过比拟 resource、type、timestamp 和 pattern 四个字段是否雷同来判断两个资源申请是否雷同的。如果一个曾经被缓存到各个节点上的文件被用户批改了,则下次应用时会主动触发一次缓存更新,以从新从 HDFS 上下载文件。
分布式缓存实现的次要性能是文件下载,波及大量的磁盘读写,因而整个过程采纳了异步并发模型放慢文件下载速度,以防止同步模型带来的性能开销。

二)分布式缓存实现

NodeManager 采纳轮询的调配策略将这三类资源寄存在 yarn.nodemanager.local-dirs 指定的目录列表中,在每个目录中,资源依照以下形式寄存:

  • PUBLIC 资源:寄存在 ${yarn.nodemanager.local-dirs}/filecache/ 目录下,每个资源将独自寄存在以一个随机整数命名的目录中,且目录的拜访权限均为 0755。
  • PRIVATE 资源:寄存在 ${yarn.nodemanager.local-dirs}/usercache/${user}/filecache/ 目录下,每个资源将独自寄存在以一个随机整数命名的目录中,且目录的拜访权限均为 0710。
  • APPLICATION 资源:寄存在 ${yarn.nodemanager.local-dirs}/usercache/${user}/${appcache}/${appid}/filecache/ 目录下,每个资源将独自寄存在以一个随机整数命名的目录中,且目录的拜访权限均为 0710。

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

./nm-local-dir/
|-- filecache        // PUBLIC 资源
|   `-- 10            // 每个资源将独自寄存在以一个随机整数命名的目录中
|-- nmPrivate
|   |-- application_xxxx_xxx
|   |   |-- container_xxx_xxx_xxx_xx_xxxx
|   |   |-- container_xxx_xxx_xxx_xx_xxxx    // 公有目录数据(执行脚本、token 文件、pid 文件)|   |   |   |-- container_xxx_xxx_xxx_xx_xxxx.pid
|   |   |   |-- container_xxx_xxx_xxx_xx_xxxx.tokens
|   |   |   `-- launch_container.sh
|   |-- application_xxxx_xxx
|   `-- application_xxxx_xxx
`-- usercache
    |-- userXxx
    |   |-- appcache        // APPLICATION 资源
    |   `-- filecache        // PRIVATE 资源
    |-- userXxx
    |   |-- appcache
    |   `-- filecache

三、清理策略

1、Container 运行完结清理
2、清理过期缓存
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)算法革除已不再应用的缓存文件,直至文件容量低于设定值。

四、小结

本篇介绍了 NodeManager 分布式缓存,当你须要看 NM 本地目录,须要理解各目录中存储内容时,本篇提供了对应的帮忙。同时也对 Container 启动流程做了简要的解说,对前面理解 Container 生命周期提供了肯定的前置常识。

退出移动版