From ab95b4f101474e57e3f0cca8ce1a76a189015315 Mon Sep 17 00:00:00 2001 From: Janis Eccarius Date: Tue, 16 Jun 2026 20:33:48 +0200 Subject: [PATCH] fix(spark): replace shared spark-events PVC with emptyDir to fix Multi-Attach error local-path provisioner is RWO-only; attaching a single PVC to master, two workers, history-server, and streaming pod on separate nodes causes Multi-Attach errors. Each pod now gets its own ephemeral emptyDir for /spark-events. Event logging confs removed from CronJobs and streaming Deployment (logs are pod-local and do not persist across restarts). Co-Authored-By: Claude Sonnet 4.6 --- spark-analytics/base/cronjobs.yaml | 36 ------------------- spark-analytics/base/streaming.yaml | 9 ----- .../eu-central-1-prod/kustomization.yaml | 20 ----------- spark-cluster/base/history-server.yaml | 3 +- spark-cluster/base/master.yaml | 3 +- spark-cluster/base/pvc.yaml | 23 +++--------- spark-cluster/base/workers.yaml | 3 +- 7 files changed, 8 insertions(+), 89 deletions(-) diff --git a/spark-analytics/base/cronjobs.yaml b/spark-analytics/base/cronjobs.yaml index 03b1538..ba7ea56 100755 --- a/spark-analytics/base/cronjobs.yaml +++ b/spark-analytics/base/cronjobs.yaml @@ -34,10 +34,6 @@ spec: - spark.executor.memory=1g - --conf - spark.driver.memory=512m - - --conf - - spark.eventLog.enabled=true - - --conf - - spark.eventLog.dir=/spark-events - --class - de.nowchess.analytics.OpeningBookJob - local:///app/analytics.jar @@ -69,15 +65,10 @@ spec: volumeMounts: - name: spark-output mountPath: /spark-output - - name: spark-events - mountPath: /spark-events volumes: - name: spark-output persistentVolumeClaim: claimName: spark-analytics-output - - name: spark-events - persistentVolumeClaim: - claimName: spark-events --- apiVersion: batch/v1 kind: CronJob @@ -115,10 +106,6 @@ spec: - spark.executor.memory=1g - --conf - spark.driver.memory=512m - - --conf - - spark.eventLog.enabled=true - - --conf - - spark.eventLog.dir=/spark-events - --class - de.nowchess.analytics.PlayerStatsJob - local:///app/analytics.jar @@ -149,15 +136,10 @@ spec: volumeMounts: - name: spark-output mountPath: /spark-output - - name: spark-events - mountPath: /spark-events volumes: - name: spark-output persistentVolumeClaim: claimName: spark-analytics-output - - name: spark-events - persistentVolumeClaim: - claimName: spark-events --- apiVersion: batch/v1 kind: CronJob @@ -195,10 +177,6 @@ spec: - spark.executor.memory=1g - --conf - spark.driver.memory=512m - - --conf - - spark.eventLog.enabled=true - - --conf - - spark.eventLog.dir=/spark-events - --class - de.nowchess.analytics.PlayerClusteringJob - local:///app/analytics.jar @@ -230,15 +208,10 @@ spec: volumeMounts: - name: spark-output mountPath: /spark-output - - name: spark-events - mountPath: /spark-events volumes: - name: spark-output persistentVolumeClaim: claimName: spark-analytics-output - - name: spark-events - persistentVolumeClaim: - claimName: spark-events --- apiVersion: batch/v1 kind: CronJob @@ -276,10 +249,6 @@ spec: - spark.executor.memory=1g - --conf - spark.driver.memory=512m - - --conf - - spark.eventLog.enabled=true - - --conf - - spark.eventLog.dir=/spark-events - --class - de.nowchess.analytics.PlayerGraphJob - local:///app/analytics.jar @@ -310,12 +279,7 @@ spec: volumeMounts: - name: spark-output mountPath: /spark-output - - name: spark-events - mountPath: /spark-events volumes: - name: spark-output persistentVolumeClaim: claimName: spark-analytics-output - - name: spark-events - persistentVolumeClaim: - claimName: spark-events diff --git a/spark-analytics/base/streaming.yaml b/spark-analytics/base/streaming.yaml index 2d14e1f..4182ffc 100755 --- a/spark-analytics/base/streaming.yaml +++ b/spark-analytics/base/streaming.yaml @@ -33,10 +33,6 @@ spec: - spark.executor.memory=512m - --conf - spark.driver.memory=512m - - --conf - - spark.eventLog.enabled=true - - --conf - - spark.eventLog.dir=/spark-events - --class - de.nowchess.analytics.LiveDashboardJob - local:///app/analytics.jar @@ -67,12 +63,7 @@ spec: volumeMounts: - name: spark-checkpoint mountPath: /spark-checkpoint - - name: spark-events - mountPath: /spark-events volumes: - name: spark-checkpoint persistentVolumeClaim: claimName: spark-streaming-checkpoint - - name: spark-events - persistentVolumeClaim: - claimName: spark-events diff --git a/spark-analytics/eu-central-1-prod/kustomization.yaml b/spark-analytics/eu-central-1-prod/kustomization.yaml index 0daa5df..cfdcc95 100755 --- a/spark-analytics/eu-central-1-prod/kustomization.yaml +++ b/spark-analytics/eu-central-1-prod/kustomization.yaml @@ -31,10 +31,6 @@ patches: - spark.executor.memory=1g - --conf - spark.driver.memory=512m - - --conf - - spark.eventLog.enabled=true - - --conf - - spark.eventLog.dir=/spark-events - --class - de.nowchess.analytics.OpeningBookJob - local:///app/analytics.jar @@ -65,10 +61,6 @@ patches: - spark.executor.memory=1g - --conf - spark.driver.memory=512m - - --conf - - spark.eventLog.enabled=true - - --conf - - spark.eventLog.dir=/spark-events - --class - de.nowchess.analytics.PlayerStatsJob - local:///app/analytics.jar @@ -98,10 +90,6 @@ patches: - spark.executor.memory=1g - --conf - spark.driver.memory=512m - - --conf - - spark.eventLog.enabled=true - - --conf - - spark.eventLog.dir=/spark-events - --class - de.nowchess.analytics.PlayerClusteringJob - local:///app/analytics.jar @@ -132,10 +120,6 @@ patches: - spark.executor.memory=1g - --conf - spark.driver.memory=512m - - --conf - - spark.eventLog.enabled=true - - --conf - - spark.eventLog.dir=/spark-events - --class - de.nowchess.analytics.PlayerGraphJob - local:///app/analytics.jar @@ -163,10 +147,6 @@ patches: - spark.executor.memory=512m - --conf - spark.driver.memory=512m - - --conf - - spark.eventLog.enabled=true - - --conf - - spark.eventLog.dir=/spark-events - --class - de.nowchess.analytics.LiveDashboardJob - local:///app/analytics.jar diff --git a/spark-cluster/base/history-server.yaml b/spark-cluster/base/history-server.yaml index 458f44b..11df170 100755 --- a/spark-cluster/base/history-server.yaml +++ b/spark-cluster/base/history-server.yaml @@ -40,8 +40,7 @@ spec: mountPath: /spark-events volumes: - name: spark-events - persistentVolumeClaim: - claimName: spark-events + emptyDir: {} --- apiVersion: v1 kind: Service diff --git a/spark-cluster/base/master.yaml b/spark-cluster/base/master.yaml index daecc6f..c664267 100755 --- a/spark-cluster/base/master.yaml +++ b/spark-cluster/base/master.yaml @@ -42,8 +42,7 @@ spec: mountPath: /spark-events volumes: - name: spark-events - persistentVolumeClaim: - claimName: spark-events + emptyDir: {} --- apiVersion: v1 kind: Service diff --git a/spark-cluster/base/pvc.yaml b/spark-cluster/base/pvc.yaml index 5638427..a733adb 100755 --- a/spark-cluster/base/pvc.yaml +++ b/spark-cluster/base/pvc.yaml @@ -1,18 +1,5 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: spark-events - labels: - app.kubernetes.io/name: spark-cluster - app.kubernetes.io/part-of: nowchess -spec: - # ReadWriteOnce for k3d/local-path compatibility. - # NOTE: k3d uses the local-path provisioner which only supports RWO. - # For production with multiple concurrent writers (workers + history server), - # replace with a RWX-capable storage class such as NFS or Longhorn and - # change accessModes to [ReadWriteMany]. - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 5Gi +# No cluster-level PVCs needed. +# Analytics output and streaming checkpoint PVCs live in spark-analytics/base/pvc.yaml. +# spark-events PVC removed: local-path provisioner is RWO-only; sharing a single PVC +# across master, workers, and history-server on different nodes causes Multi-Attach errors. +# Event logs now use emptyDir (pod-local, ephemeral) on each pod. diff --git a/spark-cluster/base/workers.yaml b/spark-cluster/base/workers.yaml index 5174b25..cbccfee 100755 --- a/spark-cluster/base/workers.yaml +++ b/spark-cluster/base/workers.yaml @@ -43,5 +43,4 @@ spec: mountPath: /spark-events volumes: - name: spark-events - persistentVolumeClaim: - claimName: spark-events + emptyDir: {}