yarn的分布式缓存主要是将用户的应用执行时所需的外部文件自动透明地加载到NodeManager上的机制。
1.yarn资源分类
按照资源的可见性,NodeManager将资源分为三类:
(1)public:只要有一个用户将这些资源下载到本地,则该机器上的所有应用都可以直接使用。
(2)private:资源被下载后该用户的所有应用都能使用该资源。
(3)application:该节点的同一应用的所有container可以共享该资源。
按照资源类型的不同,可以分为:archive(.jar等,会自动解压)、file(普通文件)、Pattern(之前两种都有)。对于MR来说,可以通过addCacheArchive()、addCachefile()等函数设置需要分布式缓存的文件。
2.yarn资源缓存路径分配策略
在yarn-site.xml中,可以挂载很多磁盘,设置多个路径,例如:
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/data-a/hadoop/yarn/local-dir,/data-b/hadoop/yarn/local-dir,/data-c/hadoop/yarn/local-dir,/data-d/hadoop/yarn/local-dir,/data-e/hadoop/yarn/local-dir,/data-f/hadoop/yarn/local-dir,/data-g/hadoop/yarn/local-dir</value>
</property>
就是挂在了7块硬盘,NodeManager通过轮询的方式将三类资源放在上面配置的路径中:
(1)public资源:放在${yarn.nodemanager.local-dirs}/filecache/目录下,资源权限为755。
(2)private资源:放在${yarn.nodemanager.local-dirs}/usercache/${user}/filecache/目录下,${user}是应用的提交者,权限为710。
(3)application资源:放在${yarn.nodemanager.local-dirs}/usercache/${user}/appcache/${appid}/filecache/目录下,权限为710。
(4)container的工作目录:放在${yarn.nodemanager.local-dirs}/usercache/${user}/appcache/${appid}/${containerid}目录下,在container运行过程中需要用到的jar包等,会通过软连接连接到对应资源。
3.yarn资源下载策略
public资源通过ResourceLocalizationService的PublicLocalizer下载。
private和application资源通过ResourceLocalizationService的LocalizerRunner(每个container对应一个线程)下载。
4.yarn资源清理策略
过期缓存会被定时删除,过期时间由yarn.nodemanager.localizer.cache.cleanup-interval-ms决定,默认为600000毫秒,即10分钟。而container输出的中间数据会在application整个都结束时才统一清理,这是为了避免application内的container间的数据依赖,例如reduce依赖map的输出。