不要跳过这部分知识,对了解 NodeManager 本地目录结构,和熟悉 Container 启动流程有帮助。
主要作用就是将用户应用程序执行时,所需的外部文件资源下载缓存到各个节点。
YARN 分布式缓存工作流程如下:
分布式缓存机制是由各个 NM 实现的,主要功能是将应用程序所需的文件资源缓存到本地,以便后续任务的使用。
资源缓存是使用时触发的,也就是第一个用到该资源的任务触发。后续任务无需再进行缓存,直接使用即可。
根据可见性,NM将资源分为三类:
YARN是通过比较 resource、type、timestamp 和 pattern四个字段是否相同来判断两个资源请求是否相同的。如果一个已经被缓存到各个节点上的文件被用户修改了,则下次使用时会自动触发一次缓存更新,以重新从HDFS上下载文件。
分布式缓存完成的主要功能是文件下载,涉及大量的磁盘读写,因此整个过程采用了异步并发模型加快文件下载速度,以避免同步模型带来的性能开销。
NodeManager 采用轮询的分配策略将这三类资源存放在 yarn.nodemanager.local-dirs
指定的目录列表中,在每个目录中,资源按照以下方式存放:
${yarn.nodemanager.local-dirs}/filecache/
目录下,每个资源将单独存放在以一个随机整数命名的目录中,且目录的访问权限均为 0755。${yarn.nodemanager.local-dirs}/usercache/${user}/filecache/
目录下,每个资源将单独存放在以一个随机整数命名的目录中,且目录的访问权限均为 0710。${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)本篇介绍了 NodeManager 分布式缓存,当你需要看 NM 本地目录,需要了解各目录中存储内容时,本篇提供了对应的帮助。同时也对 Container 启动流程做了简要的讲解,对后面了解 Container 生命周期提供了一定的前置知识。
参与评论
手机查看
返回顶部