如何对 Amazon EMR 中失败的 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 作业时,阶段日志会提供作业参数和 step 错误消息。这些日志存档到 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 网站上 Submitting applications。
示例:
spark-submit --deploy-mode client --executor-memory 4g --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples.jar
集群模式作业
要确定与失败的 Spark step 相关联的应用程序 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 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,确保您使用的是最新版本的 AWS CLI。
向 Amazon EKS 上的 Amazon EMR 提交 Spark 作业后,日志可以存储在 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 网站上 Submitting applications。
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 作业失败的根本原因。
相关信息
相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 18 天前
- AWS 官方已更新 3 年前