如何更改K8s集群中Spark Worker的配置?

问题描述 投票:0回答:1

我在 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 工作线程的启动方法或一般配置?

java apache-spark kubernetes
1个回答
0
投票

要更改 Kubernetes (K8s) 集群中 Spark Worker 的配置,您通常需要直接在 Spark 应用程序配置中或通过 Kubernetes 部署配置来更新配置。以下是如何实现这一目标的总体概述:

  1. Spark 应用程序配置: 如果您的 Spark 应用程序使用自定义配置,您可以直接在 Spark 配置文件(如

    spark-defaults.conf
    spark-env.sh
    等)或应用程序代码中修改它。这可以包括与 Spark 工作线程资源、日志记录、执行程序设置等相关的属性。

  2. Kubernetes 部署配置: 如果您在 Kubernetes 上使用 Spark,您的 Spark 应用程序通常部署为一组 Kubernetes 资源,例如 Deployment、Service,可能还包括 ConfigMap 或 Secret。

    • 部署:您可以更新部署配置以反映您想要对 Spark Worker Pod 进行的更改。这可能涉及更改资源请求和限制、环境变量、卷等。

    • ConfigMap/Secret:如果您的配置存储在 ConfigMap 或 Secret 中,您可以使用新的配置设置更新这些 Kubernetes 资源。

  3. 缩放:如果需要调整 Spark Worker Pod 的数量,可以使用

    kubectl scale
    命令或通过更新 Deployment YAML 文件中的
    replicas
    字段来相应地缩放 Deployment。

  4. 滚动更新:修改 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
或等效命令应用更新的配置。

请记住在将任何更改应用于生产之前先在暂存环境中进行测试,以确保它们的行为符合预期。

© www.soinside.com 2019 - 2024. All rights reserved.