使用Spark History Server查看Spark作業(yè)信息
Spark應(yīng)用程序在運行期間會向外提供Web UI服務(wù)用于可視化作業(yè)信息,例如Stage和Task的詳細信息、內(nèi)存使用情況等。為了能夠在作業(yè)執(zhí)行結(jié)束后查看作業(yè)執(zhí)行情況,您需要將Spark作業(yè)日志持久化到某一后端存儲中,并通過ack-spark-history-server組件去解析該日志并渲染成Web UI對外提供服務(wù)。本文將介紹如何在ACK集群中使用Spark History Server查看Spark作業(yè)的運行情況。
前提條件
已部署ack-spark-operator組件,請參見部署ack-spark-operator組件。
已通過kubectl工具連接集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群。
步驟一:部署ack-spark-history-server組件
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇 。
在應(yīng)用市場頁面,單擊應(yīng)用目錄頁簽,搜索并選中ack-spark-history-server。
在ack-spark-history-server頁面,單擊一鍵部署。
在創(chuàng)建面板中,選擇集群和命名空間,然后單擊下一步。
在參數(shù)配置頁面,設(shè)置相應(yīng)參數(shù),然后單擊確定。
以下是關(guān)于日志存儲、環(huán)境變量和Service配置參數(shù)的說明。您可以根據(jù)需求自定義參數(shù)配置。您可以在ack-spark-history-server頁面中的配置項查看全量配置項說明。
說明在部署ack-spark-history-server組件時需要指定一個日志存儲后端,例如阿里云OSS、PVC或HDFS等。
(必選)配置日志存儲后端
在配置日志存儲后端時,您可以選擇阿里云OSS、PVC或HDFS等選項。以下為各存儲后端的配置說明。
使用OSS作為存儲后端
當使用OSS作為日志存儲后端時,需要設(shè)置如下參數(shù)。
重要Spark作業(yè)在寫入日志時,需要等待作業(yè)執(zhí)行結(jié)束后才可以上傳,因此無法實時查看正在運行的作業(yè)日志,只能查看已完成作業(yè)的日志。
參數(shù)
描述
示例值
spark.history.fs.logDirectory
日志目錄的URL。確保在部署組件之前,日志目錄已創(chuàng)建,例如
spark/spark-events
。關(guān)于如何創(chuàng)建目錄請參見管理目錄。oss://<Bucket name>/spark/spark-events
storage.oss.enable
啟用阿里云對象存儲服務(wù)(OSS、OSS-HDFS)作為日志存儲后端。
true
storage.oss.endpoint
阿里云OSS訪問端點。
oss-cn-beijing-internal.aliyuncs.com
storage.oss.existingSecret
(推薦)已擁有讀取OSS訪問憑證的Secret名稱。關(guān)于如何創(chuàng)建OSS訪問憑證的Secret YAML,請參見OSS訪問憑證Secret YAML示例。
spark-oss-secret
storage.oss.createSecret
如果沒有指定已有的Secret,將自動創(chuàng)建一個用于存儲OSS訪問憑證的Secret。
不涉及。
storage.oss.createSecret.accessKeyId
阿里云AccessKey ID。
LTAIXXXXXXXXXXXXXXCuMnk
storage.oss.createSecret.accessKeySecret
阿里云AccessKey Secret。
ViuXXXXXXXXXXXXXv15yVKkGj0J
確保Secret中包含
OSS_ACCESS_KEY_ID
和OSS_ACCESS_KEY_SECRET
兩個字段。使用以下內(nèi)容創(chuàng)建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。
執(zhí)行以下命令以創(chuàng)建OSS訪問憑證Secret。
kubectl apply -f spark-oss-secret.yaml
使用PVC作為存儲后端
使用PVC作為日志存儲后端時,需要設(shè)置如下參數(shù)。
參數(shù)
描述
示例值
spark.history.fs.logDirectory
日志目錄的URL。
file:///mnt/spark/spark-events
storage.pvc.enable
啟用PVC作為日志存儲后端。
true
storage.pvc.name
已經(jīng)存在的PVC名稱。確保在
ack-spark-history-server
需要的命名空間中提前創(chuàng)建好PV和PVC,并成功綁定。關(guān)于如何創(chuàng)建并綁定PVC請參見存儲-CSI。"<PVC name>"
storage.pvc.mountPath
PVC在容器中的掛載路徑。
"/mnt"
使用HDFS作為存儲后端
使用HDFS作為存儲后端時,需要設(shè)置如下參數(shù)。
參數(shù)
描述
示例值
spark.history.fs.logDirectory
日志目錄的URL。
hdfs://namenode:port/spark/spark-events
(可選)配置Service類型和端口
默認會創(chuàng)建一個Service資源用于暴露History Server的Web UI,可以通過
service.type
和service.port
參數(shù)配置Service的類型和端口號。參數(shù)
描述
默認值
service.type
選擇Service類型。取值:
ClusterIP
NodePort
LoadBalancer
ClusterIP
service.port
Web UI訪問端口號。
18080
(可選)配置環(huán)境變量
您可以在
env
參數(shù)中添加環(huán)境變量,對History Server進行配置。環(huán)境變量
描述
默認值
SPARK_DAEMON_MEMORY
分配給History Server的內(nèi)存大小。
1g
SPARK_DAEMON_JAVA_OPTS
History Server JVM配置項。
""
SPARK_DAEMON_CLASSPATH
History Server類路徑。
""
SPARK_PUBLIC_DNS
History Server的外網(wǎng)地址。如果沒有設(shè)置歷史服務(wù)器的外網(wǎng)地址,應(yīng)用歷史將默認使用內(nèi)部地址,這可能導(dǎo)致鏈接失效。
""
SPARK_HISTORY_OPTS
一組
spark.history.*
配置項。""
您可以在
sparkConf
參數(shù)中添加配置,來設(shè)置History Server。常用配置項如下。屬性名稱
描述
默認值
spark.history.fs.update.interval
檢測日志更新的時間間隔。
10s
spark.history.fs.retainedApplications
緩存UI數(shù)據(jù)的應(yīng)用最大數(shù)量。
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
時,設(shè)置保留的日志文件數(shù)量的最大值,超過該閾值的日志文件將在清理觸發(fā)時被刪除。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
處理日志文件時創(chuàng)建的線程數(shù)量。
25%的可用CPU核數(shù)。
spark.history.store.maxDiskUsage
應(yīng)用歷史緩存所能使用的磁盤大小上限。
10g
步驟二:訪問Spark History Server Web UI
在默認配置中,Service的類型為ClusterIP。訪問Spark History Server的Web UI,需要將其服務(wù)轉(zhuǎn)發(fā)到本地的18080端口。您可以參見以下方式進行配置。如果您需要使用已有的負載均衡實例進行訪問,請參見通過使用已有負載均衡的服務(wù)暴露應(yīng)用。
通過kubectl port-forward
命令建立的端口轉(zhuǎn)發(fā)僅適用于測試環(huán)境下的快速驗證,不適合在生產(chǎn)環(huán)境中使用,使用時請注意安全風(fēng)險。
執(zhí)行以下命令,配置本地端口轉(zhuǎn)發(fā)。
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 plort-forward --namespace ${RELEASE_NAMESPACE} services/${SERVICE_NAME} 18080:${SERVICE_PORT}
預(yù)期輸出:
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作業(yè)啟用日志記錄
部署ack-spark-history-server組件后,還需在Spark作業(yè)中啟用事件日志記錄功能。請配置以下兩個參數(shù),以啟用并存儲Spark作業(yè)的事件日志。
參數(shù) | 描述 | 示例值 |
| 啟用事件日志記錄。取值:
|
|
| 事件日志存儲路徑。取值:
|
|
示例場景:在Spark作業(yè)中配置OSS日志記錄
以下是將OSS作為存儲后端進行日志記錄配置的詳細步驟。
構(gòu)建Spark容器鏡像
由于社區(qū)的Spark容器鏡像不包含訪問OSS所需的相關(guān)JAR包,您需要自行構(gòu)建Spark容器鏡像,將Hadoop OSS SDK的相關(guān)JAR包添加到鏡像中。以下是一個Dockerfile示例。關(guān)于容器鏡像服務(wù)構(gòu)建鏡像請參見使用企業(yè)版實例構(gòu)建鏡像。根據(jù)Dockerfile構(gòu)建鏡像并推送至您自己的鏡像倉庫,注意調(diào)整Spark對應(yīng)的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
創(chuàng)建Secret
在Spark作業(yè)的命名空間中,您需要創(chuàng)建一個Secret來存儲OSS訪問憑證。
創(chuàng)建如下Secret清單文件
spark-oss-secret.yaml
,用于存儲OSS訪問憑據(jù)。apiVersion: v1 kind: Secret metadata: name: spark-oss-secret namespace: default stringData: # 阿里云AccessKey ID OSS_ACCESS_KEY_ID: "" # 阿里云AccessKey Secret OSS_ACCESS_KEY_SECRET: ""
執(zhí)行以下命令,創(chuàng)建一個Secret資源。
kubectl apply -f spark-oss-secret.yaml
預(yù)期輸出:
secret/spark-oss-secret created
提交Spark作業(yè)
以下是一個SparkApplication示例,啟用了事件日志記錄功能。您需要根據(jù)具體情況修改以下參數(shù):
參數(shù)
描述
示例值
image
已構(gòu)建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
日志存放路徑。確保指定的日志存放路徑已提前創(chuàng)建,否則作業(yè)將在運行時出現(xiàn)錯誤。
oss://<Bucket name>/spark/spark-events
創(chuàng)建如下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
執(zhí)行以下命令,提交Spark作業(yè)。在完成鏡像制作和SECRET創(chuàng)建后,您可以在瀏覽器中訪問http://127.0.0.1:18080查看Spark作業(yè)情況。
kubectl apply -f spark-pi.yaml
預(yù)期輸出:
sparkapplication.sparkoperator.k8s.io/spark-pi created