Skip to content

Commit 48b9b22

Browse files
committed
add
1 parent 73612b7 commit 48b9b22

File tree

2 files changed

+40
-7
lines changed

2 files changed

+40
-7
lines changed

kyuubi-server/src/main/scala/org/apache/kyuubi/engine/spark/SparkProcessBuilder.scala

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,20 @@ class SparkProcessBuilder(
9191
buffer += s"${convertConfigKey(k)}=$v"
9292
}
9393

94+
// For spark on kubernetes, spark pod using env SPARK_USER_NAME as current user
95+
def setSparkUserName(userName: String): Unit = {
96+
buffer += CONF
97+
buffer += s"spark.kubernetes.driverEnv.SPARK_USER_NAME=$userName"
98+
buffer += CONF
99+
buffer += s"spark.kubernetes.executorEnv.SPARK_USER_NAME=$userName"
100+
}
101+
94102
// iff the keytab is specified, PROXY_USER is not supported
95-
if (!useKeytab()) {
103+
val shortUserName = useKeytab()
104+
if (shortUserName.nonEmpty) {
105+
setSparkUserName(shortUserName.get)
106+
} else {
107+
setSparkUserName(proxyUser)
96108
buffer += PROXY_USER
97109
buffer += proxyUser
98110
}
@@ -104,26 +116,27 @@ class SparkProcessBuilder(
104116

105117
override protected def module: String = "kyuubi-spark-sql-engine"
106118

107-
private def useKeytab(): Boolean = {
119+
private def useKeytab(): Option[String] = {
108120
val principal = conf.getOption(PRINCIPAL)
109121
val keytab = conf.getOption(KEYTAB)
110122
if (principal.isEmpty || keytab.isEmpty) {
111-
false
123+
None
112124
} else {
113125
try {
114126
val ugi = UserGroupInformation
115127
.loginUserFromKeytabAndReturnUGI(principal.get, keytab.get)
116-
val keytabEnabled = ugi.getShortUserName == proxyUser
117-
if (!keytabEnabled) {
128+
if (ugi.getShortUserName != proxyUser) {
118129
warn(s"The session proxy user: $proxyUser is not same with " +
119130
s"spark principal: ${ugi.getShortUserName}, so we can't support use keytab. " +
120131
s"Fallback to use proxy user.")
132+
None
133+
} else {
134+
Some(ugi.getShortUserName)
121135
}
122-
keytabEnabled
123136
} catch {
124137
case e: IOException =>
125138
error(s"Failed to login for ${principal.get}", e)
126-
false
139+
None
127140
}
128141
}
129142
}

kyuubi-server/src/test/scala/org/apache/kyuubi/engine/spark/SparkProcessBuilderSuite.scala

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,26 @@ class SparkProcessBuilderSuite extends KerberizedTestHelper with MockitoSugar {
270270
assert(!pb.toString.contains(engineRefId2))
271271
assert(pb.toString.contains(engineRefId))
272272
}
273+
274+
test("SparkProcessBuilder build spark engine with SPARK_USER_NAME") {
275+
val proxyName = "kyuubi"
276+
val conf1 = KyuubiConf(false)
277+
val b1 = new SparkProcessBuilder(proxyName, conf1)
278+
val c1 = b1.toString.split(' ')
279+
assert(c1.contains(s"spark.kubernetes.driverEnv.SPARK_USER_NAME=$proxyName"))
280+
assert(c1.contains(s"spark.kubernetes.executorEnv.SPARK_USER_NAME=$proxyName"))
281+
282+
tryWithSecurityEnabled {
283+
val conf2 = conf.set("spark.kerberos.principal", testPrincipal)
284+
.set("spark.kerberos.keytab", testKeytab)
285+
val name = ServiceUtils.getShortName(testPrincipal)
286+
val b2 = new SparkProcessBuilder(name, conf2)
287+
val c2 = b2.toString.split(' ')
288+
assert(c2.contains(s"spark.kubernetes.driverEnv.SPARK_USER_NAME=$name"))
289+
assert(c2.contains(s"spark.kubernetes.executorEnv.SPARK_USER_NAME=$name"))
290+
assert(!c2.contains(s"--proxy-user $name"))
291+
}
292+
}
273293
}
274294

275295
class FakeSparkProcessBuilder(config: KyuubiConf)

0 commit comments

Comments
 (0)