【一些概念】
本地化(Localization)
将资源下载到本地的过程,这样container运行时可以从本地加载而不是从访问远端的文件。
资源(Resource)
资源表示运行container所需要的一个文件或library,客户端在提交任务时需要指定所依赖的资源。
对于每个资源,可以指定如下属性:
Url:资源下载的地址,即NM应该从何处下载该资源。
Size:资源的大小
Timestamp:资源的时间戳(最后修改时间)
Type:资源的类型,可以是FILE(普通文件);ARCHIVE(归档文件,例如.jar,.tar.gz等);PATTERN(以上两种文件的混合,不过通常也是一个归档文件,通过配合pattern字段实现解压文件中的部分文件)
Visibility:可见性,包括PUBLIC(节点上所有用户共享该资源);PRIVATE(同一用户中所有的container共享该资源);APPLICATION(同一个Application中的所有container共享该资源)。
【架构设计】
在NM中有一个专门用于本地化的服务ResourceLocalizationService。该服务的内部整体设计如下图所示:
资源管理
用于记录本地资源的信息及状态。
按照资源的可见性划分,publicRsrc存储所有PUBLIC的资源;privateRsrc和appRsrc都是一个map,分别按用户名、appID存储PRIVATE、APPLICATION的资源。
图中的LocalResourcesTracker是一个资源集,内部包含一个map表,以资源对象为Key,记录不同的资源。map的value是NM内部对资源描述封装的一个对象,记录资源的具体信息及当前状态,例如初始化,下载中,已完成本地化。
资源本地化请求管理
负责具体资源的下载处理,其中publicLocalizer负责PUBLIC可见性的资源下载,privLocalizers负责APPLICAITON、PRIVATE可见性的资源下载。
privLocalizers内部以多线程的方式,对不同container的资源并行进行下载(每个线程负责一个container的资源下载)。
磁盘管理
监听local,log两个目录。当出现磁盘写满,或者不可写时进行回调处理。
文件删除服务
所有过期的资源文件,均由文件删除服务进行具体的删除处理。
缓存清理服务
对于PUBLIC、PRIVATE可见性的资源,其资源文件会有一定的缓存策略,该服务负责定期发送消息以检测是否对缓存进行清理。
token管理
管理到HDFS下载所需要的token。
资源状态存储
资源的状态及存储的路径等相关信息会持久化到本地文件,方便NM重启后的恢复处理。
【资源本地化流程】
资源本地化的流程如下图所示:
流程比较清晰,就不做太多的描述了,不过补充说明几点:
由于资源是有状态的,因此如果有多个运行的container依赖了同一个资源,并且该资源具有同样的可见性,那么处理的过程中,会先在内存中会找到该资源的信息及对应状态,避免不必要的重复下载。
public的资源在线程中顺序进行下载,而application和private的资源,每个container都会有一个对应的线程(LocalizerRunner),专门负责该container依赖资源的下载。
由于container的启动有DefaultContainerExecutor、LinuxContainerExecutor、DockerContainerExecutor三种方式,不同启动方式,对下载文件的权限有不同的要求,因此为统一处理逻辑,application和private的资源是在独立线(进)程中,通过RPC的方式(发送心跳请求),获取需要下载的资源列表,进行资源下载,并反馈下载的情况。
【资源管理】
资源文件存放位置
不同可见性的资源文件,其存放的位置是不同的。
对于public的资源,存放在filecache目录下。
对于private的资源,存放在usercache/${user}/filecache目录下,其中${user}为应用程序的提交用户。
对于application的资源,存放在usercache/${user}/appcache/${appid}/filecache目录下。
资源文件存储路径
MR任务运行过程中的资源存储情况
资源的生命周期
对于applicaiton的资源,container运行结束后,资源就会进行删除,而public,private的资源,则不会进行删除。
ResourceLocalizationService中的cacheCleanup会定时发送消息,以检测当前所有缓存资源的大小是否超过设置的值(默认为10GB)。如果超过,则根据资源的时间戳,按照LRU的方式删除时间最久未使用的资源。
【总结】
本文总结了NM中资源管理的相关内容,如有不对,欢迎指正交流。
如果觉得写得还不错,欢迎分享,点赞,在看~
欢迎关注,会有更多原创文章