Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
如何访问 Amazon EMR 集群上的 Spark 驱动程序日志?
我想访问 Amazon EMR 集群上的 Apache Spark 驱动程序日志,并对 Spark 应用程序进行故障排除。
解决方案
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
在 Amazon EMR 上,Spark 作为 YARN 应用程序运行,支持客户端和集群部署模式。
客户端模式作业
客户端模式是默认的部署模式。在客户端模式下,Spark 驱动程序在运行 spark-submit 命令的主机上运行。当您在主节点上使用 --deploy-mode 客户端运行 spark-submit 命令时,您会在终端窗口中收到驱动程序日志。默认情况下,Amazon EMR 不会存档这些日志。要捕获日志,请将 spark-submit 命令的输出保存到文件中。
命令示例:
spark-submit [--deploy-mode client] ... 1>output.log 2>error.log
当您使用 Amazon EMR 步骤提交 Spark 应用程序时,Amazon EMR 会将驱动程序日志存档到 Amazon Simple Storage Service (Amazon S3) 中的 stderr.gz 文件中。文件路径如下所示:
s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/stderr.gz
有关详细信息,请参阅查看归档到 Amazon S3 的日志文件。
要访问 Spark 驱动程序日志,请将步骤日志下载到 Amazon Elastic Compute Cloud (Amazon EC2) 实例,然后搜索警告和错误。
完成以下步骤:
-
运行以下同步命令下载步骤日志:
aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/ s-2M809TD67U2IA/
-
运行以下命令打开步骤日志文件夹:
cd s-2M809TD67U2IA/
-
运行以下命令解压缩日志文件:
find . -type f -exec gunzip filename\;
**注意:**将 filename 替换为您的文件名。
-
运行以下命令以从集群模式日志中获取 YARN 应用程序 ID:
grep "Client: Application report for" * | tail -n 1
-
运行以下命令以查找客户端模式日志中的错误和警告:
egrep "WARN|ERROR" *
您还可以使用 JupyterHub、Apache Livy 或 Apache Zeppelin 等应用程序作为客户端,向集群提交 Spark 应用程序。应用程序将驱动程序日志存储在主节点上的 /mnt/var/log/ 文件夹中的应用程序日志中。
您还可以在 s3://awsexamplebucket/JOBFLOW_ID/node/MASTER_ID/applications/ Amazon S3 路径中找到压缩日志。
如果您使用 Zeppelin,您可以在 /mnt/var/log/zeppelin/zeppelin-interpreter-spark-##########.log 中找到 Spark 驱动程序日志。
对于 Jupyter,您可以在 /mnt/var/log/livy/livy-livy-server.out Livy 日志中找到驱动程序日志。
集群模式作业
当您以集群模式提交 Spark 应用程序时,驱动程序进程将在应用程序主容器中运行。应用程序主容器是 Spark 应用程序运行时运行的第一个容器。客户端记录 YARN 应用程序报告。
要获取驱动程序日志,请完成以下步骤:
-
从客户端日志中获取应用程序 ID。
具有 application_1572839353552_0008 应用程序 ID 的输出示例。19/11/04 05:24:42 INFO Client: Application report for application_1572839353552_0008 (state: ACCEPTED)
-
识别应用程序主容器日志。
Spark 应用程序日志的列表示例:`s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stderr.gz` `s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stdout.gz` `s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000002/stderr.gz` `s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000002/stdout.gz`
**注意:**列表中的第一个容器始终为主容器。在前面的列表中,主容器为 container_1572839353552_0008_01_000001。
-
运行以下同步命令将应用程序主容器日志下载到实例中:
aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/ application_1572839353552_0008/
-
运行以下命令打开 Spark 应用程序日志文件夹:
cd application_1572839353552_0008/
-
运行以下命令解压缩日志文件:
find . -type f -exec gunzip {} \;
-
运行以下命令在所有容器日志中搜索错误和警告:
egrep -Ril "ERROR|WARN" . | xargs egrep "WARN|ERROR"
-
运行以下命令以获取应用程序主容器运行的节点的地址。在正在运行的集群上,您可以使用 YARN CLI 获取 YARN 应用程序容器日志:
yarn logs -applicationId application_1585844683621_0001 | grep 'Container: container_1585844683621_0001_01_000001'
预期输出:
20/04/02 19:15:09 INFO client.RMProxy: Connecting to ResourceManager at ip-###-##-##-##.us-west-2.compute.internal/###.##.##.##:8032 Container: container_1585844683621_0001_01_000001 on ip-###-##-##-##.us-west-2.compute.internal_8041
-
对于您在集群模式下提交的 Spark 应用程序,运行以下命令来提取应用程序主容器日志:
yarn logs -applicationId application_1585844683621_0001 -containerId container_1585844683621_0001_01_000001 -nodeAddress ip-###-##-##-##.us-west-2.compute.internal
**注意:**将 applicationId 替换为您的应用程序的 ID,将 containerId 替换为您的容器的 ID,将 nodeAddress ip 替换为您的节点地址。
相关信息
