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

如何对 Amazon EMR 中失败的 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 作业时,阶段日志会提供作业参数和 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 作业失败的根本原因。

相关信息

添加 Spark step

使用 EKS 上的 Amazon EMR 运行作业

日志记录和监控

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