Spark應用程式在運行期間會向外提供Web UI服務用於可視化作業資訊,例如Stage和Task的詳細資料、記憶體使用量情況等。為了能夠在作業執行結束後查看作業執行情況,您需要將Spark作業日誌持久化到某一後端儲存中,並通過ack-spark-history-server組件去解析該日誌並渲染成Web UI對外提供服務。本文將介紹如何在ACK叢集中使用Spark History Server查看Spark作業的運行情況。
前提條件
已部署ack-spark-operator組件,請參見部署ack-spark-operator組件。
已通過kubectl工具串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
步驟一:部署ack-spark-history-server組件
登入Container Service管理主控台,在左側導覽列選擇。
在應用市場頁面,單擊應用目錄頁簽,搜尋並選中ack-spark-history-server。
在ack-spark-history-server頁面,單擊一鍵部署。
在建立面板中,選擇叢集和命名空間,然後單擊下一步。
在參數配置頁面,設定相應參數,然後單擊確定。
以下是關於日誌儲存、環境變數和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-eventsstorage.oss.enable啟用阿里雲Object Storage Service服務(OSS、OSS-HDFS)作為日誌儲存後端。
truestorage.oss.endpoint阿里雲OSS訪問端點。
oss-cn-beijing-internal.aliyuncs.comstorage.oss.existingSecret(推薦)已擁有讀取OSS訪問憑證的Secret名稱。關於如何建立OSS訪問憑證的Secret YAML,請參見OSS訪問憑證Secret YAML樣本。
spark-oss-secretstorage.oss.createSecret如果沒有指定已有的Secret,將自動建立一個用於儲存OSS訪問憑證的Secret。
不涉及。
storage.oss.createSecret.accessKeyId阿里雲AccessKey ID。
yourAccessKeyID
storage.oss.createSecret.accessKeySecret阿里雲AccessKey Secret。
yourAccessKeySecret
使用PVC作為儲存後端
使用PVC作為日誌儲存後端時,需要設定如下參數。
參數
描述
樣本值
spark.history.fs.logDirectory日誌目錄的URL。
file:///mnt/spark/spark-eventsstorage.pvc.enable啟用PVC作為日誌儲存後端。
truestorage.pvc.name已經存在的PVC名稱。確保在
ack-spark-history-server需要的命名空間中提前建立好PV和PVC,並成功綁定。關於如何建立並綁定PVC請參見儲存-CSI。"<PVC name>"storage.pvc.mountPathPVC在容器中的掛載路徑。
"/mnt"使用HDFS作為儲存後端
使用HDFS作為儲存後端時,需要設定如下參數。
參數
描述
樣本值
spark.history.fs.logDirectory日誌目錄的URL。
hdfs://namenode:port/spark/spark-events(可選)配置Service類型和連接埠
預設會建立一個Service資源用於暴露History Server的Web UI,可以通過
service.type和service.port參數配置Service的類型和連接埠號碼。參數
描述
預設值
service.type選擇Service類型。取值:
ClusterIPNodePortLoadBalancer
ClusterIPservice.portWeb UI訪問連接埠號碼。
18080(可選)配置環境變數
您可以在
env參數中添加環境變數,對History Server進行配置。環境變數
描述
預設值
SPARK_DAEMON_MEMORY分配給History Server的記憶體大小。
1gSPARK_DAEMON_JAVA_OPTSHistory Server JVM配置項。
""SPARK_DAEMON_CLASSPATHHistory Server類路徑。
""SPARK_PUBLIC_DNSHistory Server的外網地址。如果沒有設定歷史伺服器的外網地址,應用歷史將預設使用內部地址,這可能導致連結失效。
""SPARK_HISTORY_OPTS一組
spark.history.*配置項。""您可以在
sparkConf參數中添加配置,來設定History Server。常用配置項如下。屬性名稱
描述
預設值
spark.history.fs.update.interval檢測日誌更新的時間間隔。
10sspark.history.fs.retainedApplications緩衝UI資料的應用最大數量。
50spark.history.ui.portHistory Server連接埠號碼。
18080spark.history.fs.cleaner.enabled是否周期性地清理事件記錄。
falsespark.history.fs.cleaner.interval當
spark.history.fs.cleaner.enabled=true時,指定清理事件記錄的時間間隔。1dspark.history.fs.cleaner.maxAge當
spark.history.fs.cleaner.enabled=true時,清理記錄檔時會刪除存活時間超過該閾值的日誌。7dspark.history.fs.cleaner.maxNum當
spark.history.fs.cleaner.enabled=true時,設定保留的記錄檔數量的最大值,超過該閾值的記錄檔將在清理觸發時被刪除。Int.MaxValuespark.history.fs.driverlog.cleaner.enabled是否周期性地清理Driver事件記錄。
spark.history.fs.cleaner.enabledspark.history.fs.driverlog.cleaner.interval當
spark.history.fs.driverlog.cleaner.enabled=true時,指定清理Driver事件記錄的時間間隔。spark.history.fs.cleaner.intervalspark.history.fs.driverlog.cleaner.maxAge當
spark.history.fs.driverlog.cleaner.enabled=true時,清理Driver事件記錄時會刪除存活時間超過該閾值的日誌。spark.history.fs.cleaner.maxAgespark.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命令建立的連接埠轉寄僅適用於測試環境下的快速驗證,不適合在生產環境中使用,使用時請注意安全風險。
執行以下命令,配置本地連接埠轉寄。
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瀏覽器中訪問http://127.0.0.1:18080,查看Spark History Server Web UI。

步驟三:在Spark作業啟用日誌記錄
部署ack-spark-history-server組件後,還需在Spark作業中啟用事件記錄記錄功能。請配置以下兩個參數,以啟用並儲存Spark作業的事件記錄。
參數 | 描述 | 樣本值 |
| 啟用事件記錄記錄。取值:
|
|
| 事件記錄儲存路徑。取值:
|
|
樣本情境:在Spark作業中配置OSS日誌記錄
以下是將OSS作為儲存後端進行日誌記錄配置的詳細步驟。
構建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建立Secret
在Spark作業的命名空間中,您需要建立一個Secret來儲存OSS訪問憑證。
建立如下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: ""執行以下命令,建立一個Secret資源。
kubectl apply -f spark-oss-secret.yaml預期輸出:
secret/spark-oss-secret created
提交Spark作業
以下是一個SparkApplication樣本,啟用了事件記錄記錄功能。您需要根據具體情況修改以下參數:
參數
描述
樣本值
image已構建Spark容器鏡像的鏡像地址。
registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/spark:3.5.2-ossfs.oss.endpoint阿里雲OSS訪問端點。
oss-cn-beijing-internal.aliyuncs.comspark.eventLog.dir日誌存放路徑。確保指定的日誌存放路徑已提前建立,否則作業將在運行時出現錯誤。
oss://<Bucket name>/spark/spark-events建立如下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執行以下命令,提交Spark作業。在完成鏡像製作和SECRET建立後,您可以在瀏覽器中訪問http://127.0.0.1:18080查看Spark作業情況。
kubectl apply -f spark-pi.yaml預期輸出:
sparkapplication.sparkoperator.k8s.io/spark-pi created