使用 AWS re:Post 即表示您同意 AWS re:Post 使用條款

如何對 Amazon EMR 中失敗的 Apache Spark 作業進行疑難排解?

3 分的閱讀內容
0

我想對 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 作業失敗的根本原因。

相關資訊

新增 Spark 步驟

在 EKS 上使用 Amazon EMR 執行作業

日誌記錄和監控

AWS 官方
AWS 官方已更新 3 個月前