我在 Bitnami Helm Chart 9.0.1 的 K8s 集群上安装了 Spark 独立集群(主节点和 2 个工作节点)(https://artifacthub.io/packages/helm/bitnami/spark)。
我正在使用“SparkLauncher”类从java应用程序(也在K8s集群上运行)提交作业,并且在Spark工作日志中我可以看到作业已提交,但配置不正确。
在工作日志中我可以看到启动命令,如下所示:
24/04/25 15:55:14 INFO DriverRunner: Launch Command: "/opt/bitnami/java/bin/java" "-cp" "spark//conf:/opt/bitnami/spark/jars/*" "-Xmx1024M" "-Dspark.driver.supervise=false" "-Dspark.app.name=org.apache.spark.examples.SparkPi" "-Dspark.submit.deployMode=cluster" "-Dspark.app.submitTime=1714060513205" "-Dspark.submit.pyFiles=" "-Dspark.rpc.askTimeout=10s" "-Dspark.master=spark://my-spark-master-0.my-spark-headless.alphada.svc.cluster.local:7077" "-Dspark.jars=file:///opt/bitnami/spark/examples/jars/spark-examples_2.12-3.5.1.jar" "org.apache.spark.deploy.worker.DriverWrapper" "spark://[email protected]:37113" "/opt/bitnami/spark/work/driver-20240425155514-0014/spark-examples_2.12-3.5.1.jar" "org.apache.spark.examples.SparkPi"
在命令中,我有例如“-Dspark.driver.supervise = false”,我试图将其更改为“true”。
Bitnami 图表为此具有“worker.javaOptions”和“worker.configOptions”值,我正在设置这两个值,更改在集群上的工作器“StatefulSet”对象中可见,但它对最终启动命令没有影响。我还尝试在我的 Java 应用程序中设置此槽“SparkLauncher”,但也不起作用。代码如下。
这是环境中的 Spark 工作线程“StatefulSet”片段,您可以在其中看到我的更改:
spec:
replicas: 2
selector:
matchLabels:
app.kubernetes.io/component: worker
app.kubernetes.io/instance: dle-spark
app.kubernetes.io/name: spark
template:
metadata:
creationTimestamp: null
labels:
app.kubernetes.io/component: worker
app.kubernetes.io/instance: dle-spark
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: spark
app.kubernetes.io/version: 3.5.1
helm.sh/chart: spark-9.0.1
spec:
volumes:
- name: empty-dir
emptyDir: {}
containers:
- name: spark-worker
image: docker.io/bitnami/spark:3.5.1-debian-12-r2
ports:
- name: http
containerPort: 8080
protocol: TCP
env:
- name: SPARK_MODE
value: worker
- name: BITNAMI_DEBUG
value: 'false'
- name: SPARK_DAEMON_MEMORY
- name: SPARK_WORKER_WEBUI_PORT
value: '8080'
- name: SPARK_DAEMON_JAVA_OPTS
value: '-Dspark.driver.supervise=true'
- name: SPARK_MASTER_URL
value: spark://dle-spark-master-svc:7077
- name: SPARK_WORKER_OPTS
value: '-Dspark.driver.supervise=true'
resources:
limits:
cpu: 750m
ephemeral-storage: 1Gi
这是我在 Java 代码中的“SparkLauncher”调用(尝试“setConf”和“addSparkArg”方法):
new SparkLauncher()
.setSparkHome("spark/")
.setDeployMode("cluster")
.setMaster("spark://my-spark-master-0.my-spark-headless.default.svc.cluster.local:7077")
.setAppResource("file:///opt/bitnami/spark/examples/jars/spark-examples_2.12-3.5.1.jar")
.setMainClass("org.apache.spark.examples.SparkPi")
.setConf("spark.driver.supervise", "true")
.addSparkArg("spark.driver.supervise", "true")
.startApplication(this);
我如何影响 K8s 集群上 Spark 工作线程的启动方法或一般配置?
要更改 Kubernetes (K8s) 集群中 Spark Worker 的配置,您通常需要直接在 Spark 应用程序配置中或通过 Kubernetes 部署配置来更新配置。以下是如何实现这一目标的总体概述:
Spark 应用程序配置: 如果您的 Spark 应用程序使用自定义配置,您可以直接在 Spark 配置文件(如
spark-defaults.conf
、spark-env.sh
等)或应用程序代码中修改它。这可以包括与 Spark 工作线程资源、日志记录、执行程序设置等相关的属性。
Kubernetes 部署配置: 如果您在 Kubernetes 上使用 Spark,您的 Spark 应用程序通常部署为一组 Kubernetes 资源,例如 Deployment、Service,可能还包括 ConfigMap 或 Secret。
部署:您可以更新部署配置以反映您想要对 Spark Worker Pod 进行的更改。这可能涉及更改资源请求和限制、环境变量、卷等。
ConfigMap/Secret:如果您的配置存储在 ConfigMap 或 Secret 中,您可以使用新的配置设置更新这些 Kubernetes 资源。
缩放:如果需要调整 Spark Worker Pod 的数量,可以使用
kubectl scale
命令或通过更新 Deployment YAML 文件中的 replicas
字段来相应地缩放 Deployment。
滚动更新:修改 Deployment 或其他相关资源后,您可以执行滚动更新以应用更改,而不会中断 Spark 应用程序的可用性。 Kubernetes 将根据您的更新策略自动管理从旧 Pod 到新 Pod 的过渡。
以下是如何更新 Spark 应用程序的部署 YAML 文件的基本示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: spark-worker
spec:
replicas: 3
selector:
matchLabels:
component: spark-worker
template:
metadata:
labels:
component: spark-worker
spec:
containers:
- name: spark-worker
image: spark-worker-image:tag
resources:
requests:
memory: "4Gi"
cpu: "2"
limits:
memory: "8Gi"
cpu: "4"
env:
- name: SPARK_WORKER_PORT
value: "8881"
# Other environment variables...
进行更改后,您可以使用
kubectl apply -f deployment.yaml
或等效命令应用更新的配置。
请记住在将任何更改应用于生产之前先在暂存环境中进行测试,以确保它们的行为符合预期。