如何访问 Amazon EMR 集群上的 Spark 驱动程序日志?

2 分钟阅读
0

我想访问 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) 实例,然后搜索警告和错误。

完成以下步骤:

  1. 运行以下同步命令下载步骤日志:

    aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/ s-2M809TD67U2IA/
  2. 运行以下命令打开步骤日志文件夹:

    cd s-2M809TD67U2IA/
  3. 运行以下命令解压缩日志文件:

    find . -type f -exec gunzip filename\;

    **注意:**将 filename 替换为您的文件名。

  4. 运行以下命令以从集群模式日志中获取 YARN 应用程序 ID:

    grep "Client: Application report for" * | tail -n 1
  5. 运行以下命令以查找客户端模式日志中的错误和警告:

    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 应用程序报告。

要获取驱动程序日志,请完成以下步骤:

  1. 从客户端日志中获取应用程序 ID。
    具有 application_1572839353552_0008 应用程序 ID 的输出示例。

    19/11/04 05:24:42 INFO Client: Application report for application_1572839353552_0008 (state: ACCEPTED)
  2. 识别应用程序主容器日志。
    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

  3. 运行以下同步命令将应用程序主容器日志下载到实例中:

    aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/ application_1572839353552_0008/
  4. 运行以下命令打开 Spark 应用程序日志文件夹:

    cd application_1572839353552_0008/
  5. 运行以下命令解压缩日志文件:

    find . -type f -exec gunzip {} \;
  6. 运行以下命令在所有容器日志中搜索错误和警告:

    egrep -Ril "ERROR|WARN" . | xargs egrep "WARN|ERROR"
  7. 运行以下命令以获取应用程序主容器运行的节点的地址。在正在运行的集群上,您可以使用 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
  8. 对于您在集群模式下提交的 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 替换为您的节点地址。

相关信息

对 Amazon EMR 集群进行故障排除

配置 Spark

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