Skip to content

Commit 884a774

Browse files
author
haolinzhang
committed
Add ephemeral storage configs for spark on kubernetes
1 parent 622bbf2 commit 884a774

File tree

3 files changed

+77
-5
lines changed

3 files changed

+77
-5
lines changed

resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/Config.scala

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,34 @@ private[spark] object Config extends Logging {
139139
.version("2.3.0")
140140
.fallbackConf(CONTAINER_IMAGE)
141141

142+
val EXECUTOR_REQUEST_EPHEMERAL_STORAGE_GB =
143+
ConfigBuilder("spark.kubernetes.executor.ephemeralStorageGB.request")
144+
.doc("Ephemeral storage to use for the executors.")
145+
.intConf
146+
.checkValue(_ >= 0, "Ephemeral storage should be a positive integer")
147+
.createWithDefault(0)
148+
149+
val EXECUTOR_LIMIT_EPHEMERAL_STORAGE_GB =
150+
ConfigBuilder("spark.kubernetes.executor.ephemeralStorageGB.limit")
151+
.doc("Ephemeral storage to use for the executors.")
152+
.intConf
153+
.checkValue(_ >= 0, "Ephemeral storage should be a positive integer")
154+
.createWithDefault(0)
155+
156+
val DRIVER_REQUEST_EPHEMERAL_STORAGE_GB =
157+
ConfigBuilder("spark.kubernetes.driver.ephemeralStorageGB.request")
158+
.doc("Ephemeral storage to use for the driver.")
159+
.intConf
160+
.checkValue(_ >= 0, "Ephemeral storage should be a positive integer")
161+
.createWithDefault(0)
162+
163+
val DRIVER_LIMIT_EPHEMERAL_STORAGE_GB =
164+
ConfigBuilder("spark.kubernetes.driver.ephemeralStorageGB.limit")
165+
.doc("Ephemeral storage to use for the driver.")
166+
.intConf
167+
.checkValue(_ >= 0, "Ephemeral storage should be a positive integer")
168+
.createWithDefault(0)
169+
142170
val CONTAINER_IMAGE_PULL_POLICY =
143171
ConfigBuilder("spark.kubernetes.container.image.pullPolicy")
144172
.doc("Kubernetes image pull policy. Valid values are Always, Never, and IfNotPresent.")

resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/features/BasicDriverFeatureStep.scala

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ private[spark] class BasicDriverFeatureStep(conf: KubernetesDriverConf)
5454
// Memory settings
5555
private val driverMemoryMiB = conf.get(DRIVER_MEMORY)
5656

57+
// Ephemeral storage settings
58+
private val driverRequestEphemeralStorageGiB = conf.get(DRIVER_REQUEST_EPHEMERAL_STORAGE_GB)
59+
private val driverLimitEphemeralStorageGiB = conf.get(DRIVER_LIMIT_EPHEMERAL_STORAGE_GB)
5760
// The default memory overhead factor to use, derived from the deprecated
5861
// `spark.kubernetes.memoryOverheadFactor` config or the default overhead values.
5962
// If the user has not set it, then use a different default for non-JVM apps. This value is
@@ -90,7 +93,8 @@ private[spark] class BasicDriverFeatureStep(conf: KubernetesDriverConf)
9093
val maybeCpuLimitQuantity = driverLimitCores.map { limitCores =>
9194
("cpu", new Quantity(limitCores))
9295
}
93-
96+
val driverRequestEphemeralQuantity = new Quantity(s"${driverRequestEphemeralStorageGiB}Gi")
97+
val driverLimitEphemeralQuantity = new Quantity(s"${driverLimitEphemeralStorageGiB}Gi")
9498
val driverResourceQuantities =
9599
KubernetesUtils.buildResourcesQuantities(SPARK_DRIVER_PREFIX, conf.sparkConf)
96100

@@ -138,7 +142,24 @@ private[spark] class BasicDriverFeatureStep(conf: KubernetesDriverConf)
138142
.addToLimits(driverResourceQuantities.asJava)
139143
.endResources()
140144
.build()
141-
145+
val driverContainerWithEphemeralRequest = if (driverRequestEphemeralStorageGiB.equals(0)) {
146+
driverContainer
147+
} else {
148+
new ContainerBuilder(driverContainer)
149+
.editResources()
150+
.addToRequests("ephemeral-storage", driverRequestEphemeralQuantity)
151+
.endResources()
152+
.build()
153+
}
154+
val driverContainerWithEphemeralLimit = if (driverLimitEphemeralStorageGiB.equals(0)) {
155+
driverContainerWithEphemeralRequest
156+
} else {
157+
new ContainerBuilder(driverContainerWithEphemeralRequest)
158+
.editResources()
159+
.addToLimits("ephemeral-storage", driverLimitEphemeralQuantity)
160+
.endResources()
161+
.build()
162+
}
142163
val driverPod = new PodBuilder(pod.pod)
143164
.editOrNewMetadata()
144165
.withName(driverPodName)
@@ -156,7 +177,7 @@ private[spark] class BasicDriverFeatureStep(conf: KubernetesDriverConf)
156177
conf.schedulerName
157178
.foreach(driverPod.getSpec.setSchedulerName)
158179

159-
SparkPod(driverPod, driverContainer)
180+
SparkPod(driverPod, driverContainerWithEphemeralLimit)
160181
}
161182

162183
override def getAdditionalPodSystemProperties(): Map[String, String] = {

resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/features/BasicExecutorFeatureStep.scala

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,10 @@ private[spark] class BasicExecutorFeatureStep(
8484
execResources.cores.get.toString
8585
}
8686
private val executorLimitCores = kubernetesConf.get(KUBERNETES_EXECUTOR_LIMIT_CORES)
87-
87+
private val executorRequestEphemeralStorageGiB = kubernetesConf.sparkConf
88+
.get(EXECUTOR_REQUEST_EPHEMERAL_STORAGE_GB)
89+
private val executorLimitEphemeralStorageGiB = kubernetesConf.sparkConf
90+
.get(EXECUTOR_LIMIT_EPHEMERAL_STORAGE_GB)
8891
private def buildExecutorResourcesQuantities(
8992
customResources: Set[ExecutorResourceRequest]): Map[String, Quantity] = {
9093
customResources.map { request =>
@@ -118,6 +121,8 @@ private[spark] class BasicExecutorFeatureStep(
118121

119122
val executorMemoryQuantity = new Quantity(s"${execResources.totalMemMiB}Mi")
120123
val executorCpuQuantity = new Quantity(executorCoresRequest)
124+
val executorRequestEphemeralQuantity = new Quantity(s"${executorRequestEphemeralStorageGiB}Gi")
125+
val executorLimitEphemeralQuantity = new Quantity(s"${executorLimitEphemeralStorageGiB}Gi")
121126
val executorResourceQuantities =
122127
buildExecutorResourcesQuantities(execResources.customResources.values.toSet)
123128

@@ -204,10 +209,28 @@ private[spark] class BasicExecutorFeatureStep(
204209
.addAllToPorts(requiredPorts.asJava)
205210
.addToArgs("executor")
206211
.build()
207-
val executorContainerWithConfVolume = if (disableConfigMap) {
212+
val executorContainerWithEphemeralRequest = if (executorRequestEphemeralStorageGiB.equals(0)) {
208213
executorContainer
209214
} else {
210215
new ContainerBuilder(executorContainer)
216+
.editResources()
217+
.addToRequests("ephemeral-storage", executorRequestEphemeralQuantity)
218+
.endResources()
219+
.build()
220+
}
221+
val executorContainerWithEphemeralLimit = if (executorLimitEphemeralStorageGiB.equals(0)) {
222+
executorContainerWithEphemeralRequest
223+
} else {
224+
new ContainerBuilder(executorContainerWithEphemeralRequest)
225+
.editResources()
226+
.addToLimits("ephemeral-storage", executorLimitEphemeralQuantity)
227+
.endResources()
228+
.build()
229+
}
230+
val executorContainerWithConfVolume = if (disableConfigMap) {
231+
executorContainerWithEphemeralLimit
232+
} else {
233+
new ContainerBuilder(executorContainerWithEphemeralLimit)
211234
.addNewVolumeMount()
212235
.withName(SPARK_CONF_VOLUME_EXEC)
213236
.withMountPath(SPARK_CONF_DIR_INTERNAL)

0 commit comments

Comments
 (0)