YARN 共享缓存提供了一种以安全且可扩展的方式将共享应用程序资源上传到 HDFS 并进行管理的功能。YARN 应用程序可以利用其他应用程序或同一应用程序的先前运行上传的资源,而无需多次重新上传和本地化相同的文件。这将节省网络资源并缩短 YARN 应用程序启动时间。
目前,YARN 共享缓存已发布并可供使用。主要组件已实现,并已在大规模生产环境中部署。仍有一些部分缺失(即强身份验证)。这些缺失的功能将作为后续第二阶段工作的一部分实现。有关更多信息,请参阅 YARN-7282。
共享缓存功能包含 4 个主要组件
YARN 应用程序开发人员和用户应使用共享缓存客户端与共享缓存进行交互。此客户端负责与共享缓存管理器进行交互,计算应用程序资源的校验和,并在共享缓存中声明应用程序资源。一旦应用程序声明了资源,它就可以在应用程序的生命周期内自由使用该资源。有关更多文档,请参阅 SharedCacheClient.java javadoc。
共享缓存 HDFS 目录存储所有共享缓存资源。它受 HDFS 权限保护,并且全局可读,但仅受信任用户可以写入。此 HDFS 目录仅由共享缓存管理器和节点管理器上的资源上传程序修改。资源使用资源的校验和分布在多个子目录中
/sharedcache/a/8/9/a896857d078/foo.jar /sharedcache/5/0/f/50f11b09f87/bar.jar /sharedcache/a/6/7/a678cb1aa8f/job.jar
共享缓存管理器负责处理来自客户端的请求并管理共享缓存的内容。它负责 HDFS 中的元数据和持久化资源。它由两个主要组件组成,后端存储和清理服务。SCM 作为一个单独的守护进程运行,可以放置在集群中的任何节点上。这允许管理员启动/停止/升级 SCM,而不会影响其他 YARN 组件(即资源管理器或节点管理器)。
后端存储负责维护和持久化有关共享缓存的元数据。这包括缓存中的资源、上次使用资源的时间以及当前正在使用该资源的应用程序列表。后备存储的实现是可插拔的,它目前使用一个内存存储,该存储在重新启动后重新创建其状态。
清理服务通过确保不再使用的资源从缓存中删除来维护 HDFS 中的持久化资源。它定期扫描缓存中的资源,如果资源已过时并且当前没有正在使用该应用程序的活动应用程序,则会驱逐资源。
共享缓存上传程序是一个在节点管理器上运行的服务,它会将资源添加到共享缓存中。它负责验证资源校验和、将资源上传到 HDFS,并通知共享缓存管理器已将资源添加到缓存中。需要注意的是,上传程序服务与容器启动是异步的,并且不会阻止 YARN 应用程序的启动。此外,以尽力而为的方式将内容添加到缓存中,并且不会影响正在运行的应用程序。一旦上传程序将资源置于共享缓存中,YARN 就会使用正常的节点管理器本地化机制向应用程序提供资源。
要支持 YARN 共享缓存,应用程序必须在应用程序提交期间使用共享缓存客户端。如果资源位于共享缓存中,共享缓存客户端将返回与资源对应的 URL。要使用缓存的资源,YARN 应用程序只需使用缓存的 URL 创建 LocalResource 对象,并在应用程序提交期间将 setShouldBeUploadedToSharedCache 设置为 true。
例如,以下是如何使用缓存的 URL 创建 LocalResource
String localPathChecksum = sharedCacheClient.getFileChecksum(localPath); URL cachedResource = sharedCacheClient.use(appId, localPathChecksum); LocalResource resource = LocalResource.newInstance(cachedResource, LocalResourceType.FILE, LocalResourceVisibility.PUBLIC size, timestamp, null, true);
管理员可以通过以下步骤最初设置共享缓存
/hadoop/bin/yarn --daemon start sharedcachemanager
可以在 yarn-default.xml 中找到配置参数,并且应在 yarn-site.xml 文件中设置。以下是配置参数及其默认值列表
名称 | 描述 | 默认值 |
---|---|---|
yarn.sharedcache.enabled | 是否启用共享缓存 | false |
yarn.sharedcache.root-dir | 共享缓存的根目录 | /sharedcache |
yarn.sharedcache.nested-level | 到达校验和目录之前的嵌套目录级别。它必须是非负数。 | 3 |
yarn.sharedcache.store.class | 要用于 SCM 存储的实现 | org.apache.hadoop.yarn.server.sharedcachemanager.store.InMemorySCMStore |
yarn.sharedcache.app-checker.class | SCM 应用检查器要使用的实现 | org.apache.hadoop.yarn.server.sharedcachemanager.RemoteAppChecker |
yarn.sharedcache.store.in-memory.staleness-period-mins | 如果自上次引用以来经过的时间超过陈旧期,则内存存储中的资源将被视为陈旧。此值以分钟为单位指定。 | 10080 |
yarn.sharedcache.store.in-memory.initial-delay-mins | 内存存储运行其首次检查以删除死掉的初始应用程序之前的初始延迟。以分钟为单位指定。 | 10 |
yarn.sharedcache.store.in-memory.check-period-mins | 内存存储检查以删除死掉的初始应用程序的频率。以分钟为单位指定。 | 720 |
yarn.sharedcache.admin.address | SCM(共享缓存管理器)中管理界面地址 | 0.0.0.0:8047 |
yarn.sharedcache.admin.thread-count | 用于处理 SCM 管理界面的线程数(默认值为 1) | 1 |
yarn.sharedcache.webapp.address | SCM(共享缓存管理器)中 Web 应用程序的地址 | 0.0.0.0:8788 |
yarn.sharedcache.cleaner.period-mins | 清理器任务运行的频率。以分钟为单位指定。 | 1440 |
yarn.sharedcache.cleaner.initial-delay-mins | 第一个清理器任务计划之前的初始延迟。以分钟为单位指定。 | 10 |
yarn.sharedcache.cleaner.resource-sleep-ms | 处理每个共享缓存资源之间的休眠时间。以毫秒为单位指定。 | 0 |
yarn.sharedcache.uploader.server.address | SCM(共享缓存管理器)中节点管理器界面的地址 | 0.0.0.0:8046 |
yarn.sharedcache.uploader.server.thread-count | 用于处理来自节点管理器的共享缓存管理器请求的线程数(默认值为 50) | 50 |
yarn.sharedcache.client-server.address | SCM(共享缓存管理器)中客户端界面的地址 | 0.0.0.0:8045 |
yarn.sharedcache.client-server.thread-count | 用于处理来自客户端的共享缓存管理器请求的线程数(默认值为 50) | 50 |
yarn.sharedcache.checksum.algo.impl | 用于计算文件校验和的算法(默认值为 SHA-256) | org.apache.hadoop.yarn.sharedcache.ChecksumSHA256Impl |
yarn.sharedcache.nm.uploader.replication.factor | 共享缓存的节点管理器上传器的复制因子(默认值为 10) | 10 |
yarn.sharedcache.nm.uploader.thread-count | 用于从节点管理器实例上传文件的线程数(默认 20) | 20 |