我有一个长时间运行的应用程序主机,它接受请求(监视器队列)。在请求中我有一个字段“用户名” - 用户,我想在一个容器上启动一个作业。
来自纱线文件:
在非安全群集中为Apache Hadoop设置的默认值是org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor。此类以Yarn用户身份运行所有容器,以避免任意用户在NodeManager中执行意外操作。
此属性的替代值是org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor。此类使用container-executor二进制文件执行容器,该二进制文件执行权限提升以运行容器作为提交应用程序请求的用户。
我已将yarn.nodemanager.container-executor.class更改为LinuxContainerExecutor。同时将yarn.nodemanager.linux-container-executor.nonsecure-mode.limit-users设置为false。如何设置将在容器上运行命令的用户?看起来像验证的唯一方法是ContainerLaunchContext.setTokens。我有下一个代码:
private def setupTokens(user: String): ByteBuffer = {
val ugi = UserGroupInformation.createProxyUser(user, UserGroupInformation.getCurrentUser)
LOG.info(s"Creating proxyuser ${ugi.getUserName} impersonated by ${UserGroupInformation.getCurrentUser}")
val credentials = ugi.getCredentials
val dob = new DataOutputBuffer();
credentials.writeTokenStorageToStream(dob);
ByteBuffer.wrap(dob.getData(), 0, dob.getLength()).duplicate();
}
val cCLC = Records.newRecord(classOf[ContainerLaunchContext])
cCLC.setCommands(List("whoami"))
cCLC.setTokens(setupTokens(user))
nmClient.startContainer(container, cCLC)
但它仍然作为运行AM的用户执行,而不是指定。
答案 0 :(得分:0)
RM只会向请求它的app-ID(及其真正的所有者)授予令牌,也不可能以AM作为一个用户和Container作为另一个用户运行App。