如何對 Amazon EMR 中失敗的 Apache Spark 作業進行疑難排解?
我想對 Amazon EMR 中失敗的 Apache Spark 作業進行疑難排解。
簡短說明
若要對 Amazon Elastic Compute Cloud (Amazon EC2) 上的 Amazon EMR 中失敗的 Spark 作業進行疑難排解,請完成下列步驟:
- 對於使用 --deploy-mode-client 提交的 Spark 作業,請檢查步驟日誌以找出步驟失敗的根本原因。
- 對於使用 --deploy-mode-cluster 提交的 Spark 作業,請先檢查步驟日誌以識別應用程式 ID。然後,檢查應用程式主要日誌以識別步驟失敗的根本原因。
若要對 Amazon Elastic Kubernetes Service (Amazon EKS) 上的 Amazon EMR 中失敗的 Spark 工作進行疑難排解,請找出 Spark 作業失敗的根本原因。為此,請檢查 Amazon Simple Storage Service (Amazon S3) 或 Amazon CloudWatch 的驅動程式日誌。
若要對 Amazon EMR Serverless 上失敗的 Spark 作業進行疑難排解,請找出 Spark 作業失敗的根本原因。為此,請檢查 Amazon EMR Serverless 應用程式主控台和驅動程式日誌中的作業執行詳細資訊。
解決方法
對 Amazon EC2 上的 Amazon EMR 失敗的 Spark 作業進行疑難排解
用戶端模式作業
在用戶端模式下部署 Spark 作業時,步驟日誌會提供作業參數和步驟錯誤訊息。這些日誌封存到 Amazon S3。
若要找出步驟失敗的根本原因,請將步驟日誌下載至 Amazon EC2 執行個體。然後,搜尋警告和錯誤。請完成下列步驟:
若要解壓縮步驟日誌檔,請執行下列命令:
find . -type f -exec gunzip {} \;
若要識別叢集模式日誌中的 YARN 應用程式 ID,請執行下列命令:
grep "Client: Application report for" * | tail -n 1
下列範例檔案表示記憶體有問題:
"ERROR SparkContext: Error initializing SparkContext.java.lang.IllegalArgumentException: Executor memory 134217728 must be at least 471859200.Please increase executor memory using the --executor-memory option or spark.executor.memory in Spark configuration."
若要解決上述錯誤,請執行 spark-submit 命令以提交記憶體更多的作業。如需詳細資訊,請參閱 Apache Spark 網站上的提交應用程式。
範例:
spark-submit --deploy-mode client --executor-memory 4g --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples.jar
叢集模式工作
若要識別與失敗步驟相關聯的應用程式 ID,請檢查 stderr 步驟日誌。步驟日誌封存到 Amazon S3。然後,識別應用程式主要日誌。以叢集模式執行的 Spark 作業會在應用程式主要日誌中執行。應用程式主要日誌是 Spark 作業啟動時執行的第一個容器。在下列範例中,container_1572839353552_0008_01_000001 是應用程式主要日誌的第一個容器。
範例:
s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stderr.gz
在識別應用程式主要日誌後,將日誌下載到 Amazon EC2 執行個體。然後,搜尋警告和錯誤。
若要解壓縮步驟日誌檔,請執行下列命令:
find . -type f -exec gunzip {} \;
若要搜尋容器日誌中的警告和錯誤,請開啟下列命令輸出中的容器日誌:
egrep -Ril "ERROR|WARN" . | xargs egrep "WARN|ERROR"
如果容器日誌表示記憶體問題,請執行下列 spark-submit 命令以提交記憶體更多的作業:
spark-submit --deploy-mode cluster --executor-memory 4g --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples.jar 1000
對 Amazon EKS 上的 Amazon EMR 失敗的 Spark 作業進行疑難排解
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱AWS CLI 錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
將 Spark 作業提交至 Amazon EKS 上的 Amazon EMR 時,日誌可以儲存在 Amazon S3 或 CloudWatch 上。確保檢查驅動程式日誌中是否有失敗的 Spark 作業。此外,使用 kubectl 命令來獲取與執行中 Spark 作業的驅動程式和執行者日誌相關的更多詳細資訊。
注意: Kubectl 命令僅適用於作用中的 Pod。當 Pod 停止時,您無法執行 kubectl 命令。
如果您使用 start-job-run 命令提交 Spark 作業,請使用下列 kubectl 命令:
kubectl get pods -n example-spark-namespace
注意: 將 example-spark-namespace 取代為用於啟動作業的 Spark 命名空間。
kubectl logs spark-example-pod-driver -n example-spark-namespace -c spark-kubernetes-driver
注意: 將 example-spark-namespace 取代為用於啟動作業的 Spark 命名空間,並將 example-pod 取代為 Pod 名稱。
如果您使用 spark-operator 命令提交 Spark 作業,請使用下列 kubectl 命令:
kubectl get pods -n example-spark-namespace
注意: 將 example-spark-namespace 取代為用於啟動作業的 Spark 命名空間。
kubectl logs example-pod-driver -n example-spark-namespace
注意: 將 example-pod 取代為 Pod 名稱,並將 example-spark-namespace 取代為用於啟動作業的 Spark 命名空間。
如果您使用 spark-submit 命令提交 Spark 作業,請使用下列 kubectl 命令。如需詳細資訊,請參閱 Apache Spark 網站上的提交應用程式。
kubectl get pods -n example-spark-namespace
注意: 將 example-spark-namespace 取代為用於啟動作業的 Spark 命名空間。
kubectl logs example-pod-driver -n example-spark-namespace
注意:將 example-spark-namespace 取代為用於啟動作業的 Spark 命名空間,並將 example-pod 取代為 Pod 名稱。
對 Amazon EMR Serverless 失敗的 Spark 作業進行疑難排解
在 Amazon EMR Serverless 中提交 Spark 作業時,依預設會對所有作業執行開啟日誌記錄。此外,您也可以為您的 Amazon S3 儲存貯體開啟 Amazon S3 日誌記錄。若要對失敗的 Spark 作業進行疑難排解,請檢視作業執行詳細資訊,然後選擇驅動程式日誌檔選項。此外,您還可以檢查儲存在 CloudWatch 中的日誌,以找出 Spark 作業失敗的根本原因。
相關資訊
相關內容
- 已提問 1 年前lg...
- 已提問 1 年前lg...
- 已提問 2 年前lg...
- 已提問 2 個月前lg...
- AWS 官方已更新 3 年前
- AWS 官方已更新 25 天前
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 年前