全部產品
Search
文件中心

Container Service for Kubernetes:使用Spark History Server查看Spark作業資訊

更新時間:Dec 26, 2025

Spark應用程式在運行期間會向外提供Web UI服務用於可視化作業資訊,例如Stage和Task的詳細資料、記憶體使用量情況等。為了能夠在作業執行結束後查看作業執行情況,您需要將Spark作業日誌持久化到某一後端儲存中,並通過ack-spark-history-server組件去解析該日誌並渲染成Web UI對外提供服務。本文將介紹如何在ACK叢集中使用Spark History Server查看Spark作業的運行情況。

前提條件

步驟一:部署ack-spark-history-server組件

  1. 登入Container Service管理主控台,在左側導覽列選擇市場 > 應用市場

  2. 應用市場頁面,單擊應用目錄頁簽,搜尋並選中ack-spark-history-server

  3. ack-spark-history-server頁面,單擊一鍵部署

  4. 建立面板中,選擇叢集和命名空間,然後單擊下一步

  5. 參數配置頁面,設定相應參數,然後單擊確定

    以下是關於日誌儲存、環境變數和Service配置參數的說明。您可以根據需求自訂參數配置。您可以在ack-spark-history-server頁面中的配置項查看全量配置項說明。

    說明

    在部署ack-spark-history-server組件時需要指定一個日誌儲存後端,例如阿里雲OSS、PVC或HDFS等。

    • (必選)配置日誌儲存後端

      在配置日誌儲存後端時,您可以選擇阿里雲OSS、PVC或HDFS等選項。以下為各儲存後端的配置說明。

      使用OSS作為儲存後端

      當使用OSS作為日誌儲存後端時,需要設定如下參數。

      重要

      Spark作業在寫入日誌時,需要等待作業執行結束後才可以上傳,因此無法即時查看正在啟動並執行作業日誌,只能查看已完成作業的日誌。

      參數

      描述

      樣本值

      spark.history.fs.logDirectory

      日誌目錄的URL。確保在部署組件之前,日誌目錄已建立,例如spark/spark-events。關於如何建立目錄請參見管理目錄

      oss://<Bucket name>/spark/spark-events

      storage.oss.enable

      啟用阿里雲Object Storage Service服務(OSS、OSS-HDFS)作為日誌儲存後端。

      true

      storage.oss.endpoint

      阿里雲OSS訪問端點。

      oss-cn-beijing-internal.aliyuncs.com

      storage.oss.existingSecret

      (推薦)已擁有讀取OSS訪問憑證的Secret名稱。關於如何建立OSS訪問憑證的Secret YAML,請參見OSS訪問憑證Secret YAML樣本

      spark-oss-secret

      storage.oss.createSecret

      如果沒有指定已有的Secret,將自動建立一個用於儲存OSS訪問憑證的Secret。

      不涉及。

      storage.oss.createSecret.accessKeyId

      阿里雲AccessKey ID。

      yourAccessKeyID

      storage.oss.createSecret.accessKeySecret

      阿里雲AccessKey Secret。

      yourAccessKeySecret

      OSS訪問憑證Secret YAML樣本

      確保Secret中包含OSS_ACCESS_KEY_IDOSS_ACCESS_KEY_SECRET兩個欄位。

      1. 使用以下內容建立spark-oss-secret.yaml。

        apiVersion: v1
        kind: Secret
        metadata:
          name: spark-oss-secret
          namespace: spark-operator
        stringData:
          OSS_ACCESS_KEY_ID: ""       # 阿里雲AccessKey ID。
          OSS_ACCESS_KEY_SECRET: ""   # 阿里雲AccessKey Secret。
      2. 執行以下命令以建立OSS訪問憑證Secret。

        kubectl apply -f spark-oss-secret.yaml

      使用PVC作為儲存後端

      使用PVC作為日誌儲存後端時,需要設定如下參數。

      參數

      描述

      樣本值

      spark.history.fs.logDirectory

      日誌目錄的URL。

      file:///mnt/spark/spark-events

      storage.pvc.enable

      啟用PVC作為日誌儲存後端。

      true

      storage.pvc.name

      已經存在的PVC名稱。確保在ack-spark-history-server需要的命名空間中提前建立好PV和PVC,並成功綁定。關於如何建立並綁定PVC請參見儲存-CSI

      "<PVC name>"

      storage.pvc.mountPath

      PVC在容器中的掛載路徑。

      "/mnt"

      使用HDFS作為儲存後端

      使用HDFS作為儲存後端時,需要設定如下參數。

      參數

      描述

      樣本值

      spark.history.fs.logDirectory

      日誌目錄的URL。

      hdfs://namenode:port/spark/spark-events

    • (可選)配置Service類型和連接埠

      預設會建立一個Service資源用於暴露History Server的Web UI,可以通過service.typeservice.port參數配置Service的類型和連接埠號碼。

      參數

      描述

      預設值

      service.type

      選擇Service類型。取值:

      • ClusterIP

      • NodePort

      • LoadBalancer

      ClusterIP

      service.port

      Web UI訪問連接埠號碼。

      18080

    • (可選)配置環境變數

      您可以在env參數中添加環境變數,對History Server進行配置。

      環境變數

      描述

      預設值

      SPARK_DAEMON_MEMORY

      分配給History Server的記憶體大小。

      1g

      SPARK_DAEMON_JAVA_OPTS

      History Server JVM配置項。

      ""

      SPARK_DAEMON_CLASSPATH

      History Server類路徑。

      ""

      SPARK_PUBLIC_DNS

      History Server的外網地址。如果沒有設定歷史伺服器的外網地址,應用歷史將預設使用內部地址,這可能導致連結失效。

      ""

      SPARK_HISTORY_OPTS

      一組spark.history.*配置項。

      ""

      您可以在sparkConf參數中添加配置,來設定History Server。常用配置項如下。

      屬性名稱

      描述

      預設值

      spark.history.fs.update.interval

      檢測日誌更新的時間間隔。

      10s

      spark.history.fs.retainedApplications

      緩衝UI資料的應用最大數量。

      50

      spark.history.ui.port

      History Server連接埠號碼。

      18080

      spark.history.fs.cleaner.enabled

      是否周期性地清理事件記錄。

      false

      spark.history.fs.cleaner.interval

      spark.history.fs.cleaner.enabled=true 時,指定清理事件記錄的時間間隔。

      1d

      spark.history.fs.cleaner.maxAge

      spark.history.fs.cleaner.enabled=true時,清理記錄檔時會刪除存活時間超過該閾值的日誌。

      7d

      spark.history.fs.cleaner.maxNum

      spark.history.fs.cleaner.enabled=true時,設定保留的記錄檔數量的最大值,超過該閾值的記錄檔將在清理觸發時被刪除。

      Int.MaxValue

      spark.history.fs.driverlog.cleaner.enabled

      是否周期性地清理Driver事件記錄。

      spark.history.fs.cleaner.enabled

      spark.history.fs.driverlog.cleaner.interval

      spark.history.fs.driverlog.cleaner.enabled=true 時,指定清理Driver事件記錄的時間間隔。

      spark.history.fs.cleaner.interval

      spark.history.fs.driverlog.cleaner.maxAge

      spark.history.fs.driverlog.cleaner.enabled=true時,清理Driver事件記錄時會刪除存活時間超過該閾值的日誌。

      spark.history.fs.cleaner.maxAge

      spark.history.fs.numReplayThreads

      處理記錄檔時建立的線程數量。

      25%的可用CPU核心數。

      spark.history.store.maxDiskUsage

      應用歷史緩衝所能使用的磁碟大小上限。

      10g

步驟二:訪問Spark History Server Web UI

在預設配置中,Service的類型為ClusterIP。訪問Spark History Server的Web UI,需要將其服務轉寄到本地的18080連接埠。您可以參見以下方式進行配置。如果您需要使用已有的Server Load Balancer執行個體進行訪問,請參見通過使用已有負載平衡的服務暴露應用

重要

通過kubectl port-forward命令建立的連接埠轉寄僅適用於測試環境下的快速驗證,不適合在生產環境中使用,使用時請注意安全風險。

  1. 執行以下命令,配置本地連接埠轉寄。

    RELEASE_NAME=spark-history-server
    RELEASE_NAMESPACE=spark-operator
    
    SERVICE_NAME=${RELEASE_NAME}-service
    SERVICE_PORT=$(kubectl get service ${SERVICE_NAME} --namespace ${RELEASE_NAMESPACE} -o jsonpath="{.spec.ports[0].port}")
    
    echo "Now you can go to http://127.0.0.1:18080 to visit spark history server."
    kubectl port-forward --namespace ${RELEASE_NAMESPACE} services/${SERVICE_NAME} 18080:${SERVICE_PORT}

    預期輸出:

    Now you can go to http://127.0.0.1:18080 to visit spark history server.
    Forwarding from 127.0.0.1:18080 -> 18080
    Forwarding from [::1]:18080 -> 18080
  2. 瀏覽器中訪問http://127.0.0.1:18080,查看Spark History Server Web UI。

    image

步驟三:在Spark作業啟用日誌記錄

部署ack-spark-history-server組件後,還需在Spark作業中啟用事件記錄記錄功能。請配置以下兩個參數,以啟用並儲存Spark作業的事件記錄。

參數

描述

樣本值

spark.eventLog.enabled

啟用事件記錄記錄。取值:

  • true

  • false

true

spark.eventLog.dir

事件記錄儲存路徑。取值:

  • oss://<Bucket name>/spark/spark-events(OSS路徑)

  • hdfs://namenode:port/spark/spark-events(HDFS路徑)

  • file:///tmp/spark/spark-events(本地路徑)

oss://<Bucket name>/spark/spark-events

樣本情境:在Spark作業中配置OSS日誌記錄

以下是將OSS作為儲存後端進行日誌記錄配置的詳細步驟。

  1. 構建Spark容器鏡像

    由於社區的Spark容器鏡像不包含訪問OSS所需的相關JAR包,您需要自行構建Spark容器鏡像,將Hadoop OSS SDK的相關JAR包添加到鏡像中。以下是一個Dockerfile樣本。關於Container Registry構建鏡像請參見使用企業版執行個體構建鏡像。根據Dockerfile構建鏡像並推送至您自己的鏡像倉庫,注意調整Spark對應的Hadoop版本的依賴JAR包。

    ARG SPARK_IMAGE=registry-cn-hangzhou.ack.aliyuncs.com/dev/spark:3.5.2
    
    FROM ${SPARK_IMAGE}
    
    # Add dependency for Hadoop Aliyun OSS support
    ADD --chmod=644 https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aliyun/3.3.4/hadoop-aliyun-3.3.4.jar ${SPARK_HOME}/jars
    ADD --chmod=644 https://repo1.maven.org/maven2/com/aliyun/oss/aliyun-sdk-oss/3.17.4/aliyun-sdk-oss-3.17.4.jar ${SPARK_HOME}/jars
    ADD --chmod=644 https://repo1.maven.org/maven2/org/jdom/jdom2/2.0.6.1/jdom2-2.0.6.1.jar ${SPARK_HOME}/jars
  2. 建立Secret

    在Spark作業的命名空間中,您需要建立一個Secret來儲存OSS訪問憑證。

    1. 建立如下Secret資訊清單檔spark-oss-secret.yaml,用於儲存OSS訪問憑據。

      apiVersion: v1
      kind: Secret
      metadata:
        name: spark-oss-secret
        namespace: default
      stringData:
        # 阿里雲AccessKey ID
        OSS_ACCESS_KEY_ID: ""
        # 阿里雲AccessKey Secret
        OSS_ACCESS_KEY_SECRET: ""
    2. 執行以下命令,建立一個Secret資源。

      kubectl apply -f spark-oss-secret.yaml

      預期輸出:

      secret/spark-oss-secret created
  3. 提交Spark作業

    以下是一個SparkApplication樣本,啟用了事件記錄記錄功能。您需要根據具體情況修改以下參數:

    參數

    描述

    樣本值

    image

    已構建Spark容器鏡像的鏡像地址。

    registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.2-oss

    fs.oss.endpoint

    阿里雲OSS訪問端點。

    oss-cn-beijing-internal.aliyuncs.com

    spark.eventLog.dir

    日誌存放路徑。確保指定的日誌存放路徑已提前建立,否則作業將在運行時出現錯誤。

    oss://<Bucket name>/spark/spark-events

    1. 建立如下SparkApplication資訊清單檔,並儲存為spark-pi.yaml

      apiVersion: sparkoperator.k8s.io/v1beta2
      kind: SparkApplication
      metadata:
        name: spark-pi-oss
        namespace: default
      spec:
        type: Scala
        mode: cluster
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.2-oss
        mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.2.jar
        mainClass: org.apache.spark.examples.SparkPi
        sparkVersion: 3.5.2
        hadoopConf:
          fs.AbstractFileSystem.oss.impl: org.apache.hadoop.fs.aliyun.oss.OSS
          fs.oss.impl: org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem
          # OSS訪問端點
          fs.oss.endpoint: oss-cn-beijing-internal.aliyuncs.com
          fs.oss.credentials.provider: com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider
        sparkConf:
          spark.eventLog.enabled: "true"
          # 日誌存放路徑
          spark.eventLog.dir: oss://<Bucket name>/spark/spark-events
        driver:
          cores: 1
          coreLimit: 1200m
          memory: 512m
          serviceAccount: spark-operator-spark
          envFrom:
          - secretRef:
              name: spark-oss-secret
        executor:
          instances: 1
          cores: 1
          coreLimit: 1200m
          memory: 512m
          envFrom:
          - secretRef:
              name: spark-oss-secret
        restartPolicy:
          type: Never
    2. 執行以下命令,提交Spark作業。在完成鏡像製作和SECRET建立後,您可以在瀏覽器中訪問http://127.0.0.1:18080查看Spark作業情況。

      kubectl apply -f spark-pi.yaml

      預期輸出:

      sparkapplication.sparkoperator.k8s.io/spark-pi created