前言
在YARN上运行的任务,在任务正式开始运行之前,需要有一步资源的localization的过程,然后用户的任务才能顺利地跑起来。这个”资源“可以是用户依赖的库文件等任务运行所需要的文件。这些资源文件被YARN中此任务对应的Container所共享,这些Container会从一个共享存储的地方去下载这个资源文件。那么在此之前,这个资源文件还需要被上传到一个共享存储的地方。本文,笔者将要阐述的主题就是关于共享存储的主题。
YARN的共享存储服务的起源
在YARN早期的实现中,YARN将HDFS作为一个中间资源文件的存储媒介,然后后续的Container task根据资源路径从HDFS中download下文件。这个资源文件并不是完全共享的,它只作用于当前所属的应用,更准确地来说,它只作用于某个applicationId。在这种模式下,假设后续有完全相同的任务再次被执行,它还是要上传完全一样的文件到HDFS中,这无疑造成了带宽的浪费。
于是,YARN实现了一种真正意义上的完全共享的存储服务,它可以跨应用间提供资源的共享服务,下面开始进入本文的主题。
YARN的共享存储服务架构
共享存储服务的组件构成
YARN的共享存储服务并没有实现在现有的RM服务中,而是另外实现了一个独立的服务来做这个事情,名为ShardCacheManager。在这个Manager内,具体模块包含以下:
- SharedCacheUploaderService,缓存资源上传服务,用以上传用户的资源文件。
- CleanerService,缓存资源清理服务,清理stale的资源文件。
- ClientProtocolService,用户提交使用资源的协议。
- SCMAdminProtocolService,共享存储服务管理员接口服务,目前只要用于外界人工触发启动clea