[ 
https://issues.apache.org/jira/browse/SPARK-52616?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Xiaobao Wu resolved SPARK-52616.
--------------------------------
    Resolution: Fixed

> The volcano podgroup created by spark cluster mode in some scenarios is 
> useless
> -------------------------------------------------------------------------------
>
>                 Key: SPARK-52616
>                 URL: https://issues.apache.org/jira/browse/SPARK-52616
>             Project: Spark
>          Issue Type: Bug
>          Components: Kubernetes
>    Affects Versions: 3.3.2
>         Environment: {*}K8S version{*}:
> {code:bash}
> $ kubectl version
> Client Version: version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.8", 
> GitCommit:"0ce7342c984110dfc93657d64df5dc3b2c0d1fe9", GitTreeState:"clean", 
> BuildDate:"2023-03-15T13:39:54Z", GoVersion:"go1.19.7", Compiler:"gc", 
> Platform:"linux/amd64"}
> Kustomize Version: v4.5.7
> Server Version: version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.8", 
> GitCommit:"0ce7342c984110dfc93657d64df5dc3b2c0d1fe9", GitTreeState:"clean", 
> BuildDate:"2023-03-15T13:33:02Z", GoVersion:"go1.19.7", Compiler:"gc", 
> Platform:"linux/amd64"}
> {code}
> {*}OS{*}:
> {code:bash}
> $ cat /etc/os-release 
> NAME="Kylin Linux Advanced Server"
> VERSION="V10 (Tercel)"
> ID="kylin"
> VERSION_ID="V10"
> PRETTY_NAME="Kylin Linux Advanced Server V10 (Tercel)"
> ANSI_COLOR="0;31"
> {code}
>            Reporter: Xiaobao Wu
>            Priority: Major
>
> h3. Description
> h4.  Issue Phenomenon
> In some scenarios, even after the podgroup is specified by the 
> podGroupTemplateFile, the volcano-controllers will still create a default 
> podgroup, which will cause the podgroup specified by the user in the 
> podGroupTemplateFile to fail to work.
> h4.  Preliminary Conclusion
> When spark create a podgroup at a slower time than volcano-controllers, the 
> podgroup created by spark cannot play its original meaning ( if user 
> configures a minResource ). 
> h4.  Preliminary analysis
> 1. spark job status:
> {code:bash}
> $ kubectl -n spark-test get po
> NAME                               READY   STATUS    RESTARTS   AGE
> spark-pi-5b5529971602bcd7-exec-1   0/1     Pending   0          46m
> spark-pi-5d020597160284cc-driver   1/1     Running   0          47m
> spark-pi-6b8f9c971602bf1f-exec-1   0/1     Pending   0          46m
> spark-pi-9b535397160284a9-driver   1/1     Running   0          47m
> $ kubectl -n spark-test get pg
> NAME                                              STATUS    MINMEMBER   
> RUNNINGS   AGE
> podgroup-317e69ec-9094-47cf-bcf0-cc0674f27614     Running   1           1     
>      48m
> podgroup-a0dc2097-c30a-4c9d-9d0e-b400e32979a0     Running   1           1     
>      48m
> spark-33b811a7bb1c4c92a443afb719dd00bb-podgroup   Pending   1                 
>      48m
> spark-3bc4595a02fe4d088d47516e0316c359-podgroup   Pending   1                 
>      48m
> $ kubectl -n spark-test get po -o yaml | grep group-name
>       scheduling.k8s.io/group-name: 
> podgroup-317e69ec-9094-47cf-bcf0-cc0674f27614
>       scheduling.k8s.io/group-name: 
> podgroup-a0dc2097-c30a-4c9d-9d0e-b400e32979a0
> {code}
> 2. volcano-controllers log:
> {code:bashl}
> I0528 16:29:13.550489       1 pg_controller.go:174] Try to create podgroup 
> for pod spark-test/spark-pi-5d020597160284cc-driver
> I0528 16:29:13.555823       1 pg_controller.go:174] Try to create podgroup 
> for pod spark-test/spark-pi-9b535397160284a9-driver
> {code}
> 3. code views:
> spark add podGroup annotation (scheduling.k8s.io/group-name) in : 
> [spark/resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/features/VolcanoFeatureStep.scala|https://github.com/apache/spark/blob/5103e00c4ce5fcc4264ca9c4df12295d42557af6/resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/features/VolcanoFeatureStep.scala#L62]
> volcano-controller to determine whether podgroup exists in:
> [volcano/pkg/controllers/podgroup/pg_controller.go|https://github.com/volcano-sh/volcano/blob/f1141171980bee89114c9be3f0e3c1472848e0b0/pkg/controllers/podgroup/pg_controller.go#L168-L171]
> h3. Steps to reproduce the issue
> 1. Create queue for spark jobs:
> {code:yaml}
> # the queue.yaml use for spark job
> apiVersion: scheduling.volcano.sh/v1beta1
> kind: Queue
> metadata:
>   name: spark-test
> spec:
>   capability:
>     cpu: "2"
>     memory: "2Gi"
> {code}
> 2. Prepare podGroup template:
> {code:yaml}
> # podgroup-template.yaml
> apiVersion: scheduling.volcano.sh/v1beta1
> kind: PodGroup
> spec:
>   minMember: 1
>   minResources:
>     cpu: "2"
>     memory: "2048Mi"
>   queue: spark-test
> {code}
> 3. Submit two Spark jobs with the same content in parallel:
> {code:bash}
> /data/spark/spark-3.3.2-bin-hadoop3/bin/spark-submit --master 
> k8s://https://127.0.0.1:6443 --deploy-mode cluster --name spark-pi \
>   --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
>   --conf spark.kubernetes.namespace=spark-test \
>   --class org.apache.spark.examples.SparkPi \
>   --conf spark.executor.instances=1 \
>   --conf spark.executor.cores=1 \
>   --conf spark.executor.memory=1G \
>   --conf spark.driver.cores=1 \
>   --conf spark.driver.memoryOverhead=0 \
>   --conf spark.executor.memoryOverhead=0 \
>   --conf spark.driver.memory=1G \
>   --conf spark.kubernetes.driver.limit.cores=1 \
>   --conf spark.kubernetes.executor.limit.cores=1 \
>   --conf spark.kubernetes.executor.limit.memory=1G \
>   --conf spark.kubernetes.container.image=spark:v3.3.2-volcano \
>   --conf spark.kubernetes.scheduler.name=volcano \
>   --conf 
> spark.kubernetes.scheduler.volcano.podGroupTemplateFile=./podgroup-template.yaml
>  \
>   --conf 
> spark.kubernetes.driver.pod.featureSteps=org.apache.spark.deploy.k8s.features.VolcanoFeatureStep
>  \
>   --conf 
> spark.kubernetes.executor.pod.featureSteps=org.apache.spark.deploy.k8s.features.VolcanoFeatureStep
>  \
>   local:///opt/spark/examples/jars/spark-examples_2.12-3.3.2.jar 3000
> {code}
> 4. Watch the yaml information of the driver pod:
> {code:bash}
> $ kubectl -n spark-test get po -w -o yaml
> apiVersion: v1
> kind: Pod
> metadata:
>   annotations:
>     scheduling.volcano.sh/queue-name: spark-test
>   creationTimestamp: "2025-06-30T11:03:37Z"
>   labels:
>     spark-app-name: spark-pi
>     spark-app-selector: spark-30fa0ac622a244b1a6e7e4df34b2a274
>     spark-role: driver
>     spark-version: 3.3.2
>   name: spark-pi-f41e8097c081b4f6-driver
>   namespace: spark-test
>   resourceVersion: "263622003"
>   uid: a8dfd10e-deea-43bf-ae51-acdf23a0431f
> spec:
>   containers:
>   - args:
>     - driver
>     - --properties-file
>     - /opt/spark/conf/spark.properties
>     - --class
>     - org.apache.spark.examples.SparkPi
>     - local:///opt/spark/examples/jars/spark-examples_2.12-3.3.2.jar
>     - "3000"
>     image: spark:v3.3.2-volcano
>     imagePullPolicy: IfNotPresent
>     name: spark-kubernetes-driver
>     resources:
>       limits:
>         cpu: "1"
>         memory: 1Gi
>       requests:
>         cpu: "1"
>         memory: 1Gi
>     terminationMessagePath: /dev/termination-log
>     terminationMessagePolicy: File
>   dnsPolicy: ClusterFirst
>   enableServiceLinks: true
>   nodeSelector: {}
>   preemptionPolicy: PreemptLowerPriority
>   priority: 0
>   restartPolicy: Never
>   schedulerName: volcano
>   securityContext: {}
>   serviceAccount: spark
>   serviceAccountName: spark
>   terminationGracePeriodSeconds: 30
>   tolerations:
>   - effect: NoExecute
>     key: node.kubernetes.io/not-ready
>     operator: Exists
>     tolerationSeconds: 300
>   - effect: NoExecute
>     key: node.kubernetes.io/unreachable
>     operator: Exists
>     tolerationSeconds: 300
> status:
>   phase: Pending
>   qosClass: Guaranteed
> ---
> apiVersion: v1
> kind: Pod
> metadata:
>   annotations:
>     scheduling.k8s.io/group-name: 
> podgroup-a8dfd10e-deea-43bf-ae51-acdf23a0431f
>     scheduling.volcano.sh/queue-name: spark-test
>   creationTimestamp: "2025-06-30T11:03:37Z"
>   labels:
>     spark-app-name: spark-pi
>     spark-app-selector: spark-30fa0ac622a244b1a6e7e4df34b2a274
>     spark-role: driver
>     spark-version: 3.3.2
>   name: spark-pi-f41e8097c081b4f6-driver
>   namespace: spark-test
>   resourceVersion: "263622010"
>   uid: a8dfd10e-deea-43bf-ae51-acdf23a0431f
> spec:
>   containers:
>   - args:
>     - driver
>     - --properties-file
>     - /opt/spark/conf/spark.properties
>     - --class
>     - org.apache.spark.examples.SparkPi
>     - local:///opt/spark/examples/jars/spark-examples_2.12-3.3.2.jar
>     - "3000"
>     image: spark:v3.3.2-volcano
>     imagePullPolicy: IfNotPresent
>     name: spark-kubernetes-driver
>     resources:
>       limits:
>         cpu: "1"
>         memory: 1Gi
>       requests:
>         cpu: "1"
>         memory: 1Gi
>     terminationMessagePath: /dev/termination-log
>     terminationMessagePolicy: File
>   dnsPolicy: ClusterFirst
>   enableServiceLinks: true
>   nodeSelector: {}
>   preemptionPolicy: PreemptLowerPriority
>   priority: 0
>   restartPolicy: Never
>   schedulerName: volcano
>   securityContext: {}
>   serviceAccount: spark
>   serviceAccountName: spark
>   terminationGracePeriodSeconds: 30
>   tolerations:
>   - effect: NoExecute
>     key: node.kubernetes.io/not-ready
>     operator: Exists
>     tolerationSeconds: 300
>   - effect: NoExecute
>     key: node.kubernetes.io/unreachable
>     operator: Exists
>     tolerationSeconds: 300
> status:
>   phase: Pending
>   qosClass: Guaranteed
> ··· ···
> {code}
> 5. Watch the creation process of podgroup:
> {code:bash}
> $ kubectl -n spark-test get pg -w
> NAME                                              STATUS   MINMEMBER   
> RUNNINGS   AGE
> spark-30fa0ac622a244b1a6e7e4df34b2a274-podgroup            1                  
>     0s
> podgroup-a8dfd10e-deea-43bf-ae51-acdf23a0431f     Pending   1                 
>      0s
> spark-30fa0ac622a244b1a6e7e4df34b2a274-podgroup   Pending   1                 
>      0s
> podgroup-a8dfd10e-deea-43bf-ae51-acdf23a0431f     Running   1                 
>      0s
> spark-30fa0ac622a244b1a6e7e4df34b2a274-podgroup             1                 
>      0s
> spark-30fa0ac622a244b1a6e7e4df34b2a274-podgroup   Pending   1                 
>      1s
> podgroup-a8dfd10e-deea-43bf-ae51-acdf23a0431f     Running   1           1     
>      21s
> podgroup-a8dfd10e-deea-43bf-ae51-acdf23a0431f     Running   1           2     
>      49s
> podgroup-a8dfd10e-deea-43bf-ae51-acdf23a0431f     Running   1           1     
>      2m23s
> podgroup-a8dfd10e-deea-43bf-ae51-acdf23a0431f     Running   1           1     
>      2m25s
> podgroup-a8dfd10e-deea-43bf-ae51-acdf23a0431f     Running   1           1     
>      2m26s
> podgroup-a8dfd10e-deea-43bf-ae51-acdf23a0431f     Completed   1               
>        2m27s
> spark-30fa0ac622a244b1a6e7e4df34b2a274-podgroup   Inqueue     1               
>        2m27s
> {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to