确定 Apache Spark 作业中的当前 Kerberos 用户
Determining the current Kerberos user in an Apache Spark job
我正在启用 Kerberos 的集群 (Cloudera) 上 运行ning Spark 作业,并且希望能够记录用户的 Kerberos 身份,对于任何给定的 运行一份工作。
(注意这不是启动作业的本地Linux用户的身份,因为我们使用keytab文件,jaas.conf
文件,在启动中调用kinit
脚本。我们可以在启动脚本中记录一个身份,因为我们知道与密钥表一起传递给 kinit
的主体,但是能够在实际的 Spark 作业本身中进行记录会很好,这样即使一个作业是手动启动的,我们可靠地知道它 运行 下的身份)。
一些答案建议如下:
import java.security.{AccessController,Principal}
import javax.security.auth.Subject
val acc = AccessController.getContext
val sub = Subject.getSubject(acc)
val principals = sub.getPrincipals
但返回的 sub
是 null
,所以这不起作用。
您需要查看 UserGroupInformation
class。
要获取登录用户,您可以使用:
import org.apache.hadoop.security.UserGroupInformation
val user = UserGroupInformation.getLoginUser
res6: org.apache.hadoop.security.UserGroupInformation = USER@REALM (auth:KERBEROS)
我正在启用 Kerberos 的集群 (Cloudera) 上 运行ning Spark 作业,并且希望能够记录用户的 Kerberos 身份,对于任何给定的 运行一份工作。
(注意这不是启动作业的本地Linux用户的身份,因为我们使用keytab文件,jaas.conf
文件,在启动中调用kinit
脚本。我们可以在启动脚本中记录一个身份,因为我们知道与密钥表一起传递给 kinit
的主体,但是能够在实际的 Spark 作业本身中进行记录会很好,这样即使一个作业是手动启动的,我们可靠地知道它 运行 下的身份)。
一些答案建议如下:
import java.security.{AccessController,Principal}
import javax.security.auth.Subject
val acc = AccessController.getContext
val sub = Subject.getSubject(acc)
val principals = sub.getPrincipals
但返回的 sub
是 null
,所以这不起作用。
您需要查看 UserGroupInformation
class。
要获取登录用户,您可以使用:
import org.apache.hadoop.security.UserGroupInformation
val user = UserGroupInformation.getLoginUser
res6: org.apache.hadoop.security.UserGroupInformation = USER@REALM (auth:KERBEROS)