查看SparkContext的源代码,在尝试获取当前用户名时导致异常的行。在里面
version 1.2
存在回退默认值
SparkContext.SPARK_UNKNOWN_USER
并且不需要当前登录的用户:
// Set SPARK_USER for user who is running SparkContext.
val sparkUser = Option {
Option(System.getenv("SPARK_USER")).getOrElse(System.getProperty("user.name"))
}.getOrElse {
SparkContext.SPARK_UNKNOWN_USER
}
此代码在中引入
version 1.3
不再具有默认用户,因此为什么在早期版本中不会出现此错误:
// Set SPARK_USER for user who is running SparkContext.
val sparkUser = Utils.getCurrentUserName()
这将调用
following code
在里面
Utils
:
/**
* Returns the current user name. This is the currently logged in user, unless that's been
* overridden by the `SPARK_USER` environment variable.
*/
def getCurrentUserName(): String = {
Option(System.getenv("SPARK_USER"))
.getOrElse(UserGroupInformation.getCurrentUser().getShortUserName())
}
如果设置环境变量
SPARK_USER
,您应该能够防止分支到UserGroupInformation,这会导致异常。
UserGroupInformation
是Hadoop安全类,它看起来像
PowerMock
使其无法正常工作。