Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何對 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 作業失敗的根本原因。
相關資訊
- 語言
- 中文 (繁體)

相關內容
- 已提問 2 年前
- 已提問 1 年前