存储日志 - Amazon EMR

存储日志

要在 EMR Serverless 上监控作业进度并排除作业故障,请选择 EMR Serverless 存储和提供应用程序日志的方式。提交作业运行时,请指定托管存储、Amazon S3 和 Amazon CloudWatch 作为日志选项。

使用 CloudWatch,请指定要使用的日志类型和日志位置,或者接受默认类型和位置。有关 CloudWatch 日志的更多信息,请参阅 使用 Amazon CloudWatch 的 EMR Serverless 日志记录。对于托管存储和 S3 日志记录,下表列出了选择托管存储Amazon S3 存储桶或两者时预期的日志位置和 UI 可用性。

选项 事件日志 容器日志 应用程序 UI

托管存储

存储在托管存储中

存储在托管存储中

支持

托管存储和 S3 存储桶

存放在两个位置

存储在 S3 存储桶中

支持

Amazon S3 存储桶

存储在 S3 存储桶中

存储在 S3 存储桶中

不支持1

1 建议您保持选中托管存储。否则,您将无法使用内置应用程序 UI。

使用托管存储的 EMR Serverless 日志记录

默认情况下,EMR Serverless 将应用程序日志安全存储在 Amazon EMR 托管存储中,最长 30 天。

注意

如果关闭默认选项,Amazon EMR 将无法代表您对作业进行故障排除。示例:您无法从 EMR Serverless 控制台访问 Spark-UI。

要从 EMR Studio 关闭此选项,请取消选中提交作业页面的其他设置部分中的允许 AWS 保留日志 30 天复选框。

要从 AWS CLI 关闭此选项,请在提交作业运行时使用 managedPersistenceMonitoringConfiguration 配置。

{ "monitoringConfiguration": { "managedPersistenceMonitoringConfiguration": { "enabled": false } } }

如果您的 EMR Serverless 应用程序位于具有适用于 Amazon S3 的 VPC 端点的私有子网中,并且您附加了端点策略来控制访问,请为 EMR Serverless 添加以下权限以存储和提供应用程序日志。请将 Resource 替换为 Sample policies for private subnets that access Amazon S3 中可用区域表中的 AppInfo 存储桶。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Sid": "EMRServerlessManagedLogging", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::prod.us-east-1.appinfo.src", "arn:aws:s3:::prod.us-east-1.appinfo.src/*" ], "Condition": { "StringEquals": { "aws:PrincipalServiceName": "emr-serverless.amazonaws.com", "aws:SourceVpc": "vpc-12345678" } } } ] }

此外,使用 aws:SourceVpc 条件键确保请求通过 VPC 端点所附加的 VPC 进行传输。

使用 Amazon S3 存储桶的 EMR Serverless 日志记录

在作业将日志数据发送到 Amazon S3 之前,请在作业运行时角色的权限策略中包含以下权限。将 amzn-s3-demo-logging-bucket 替换为日志记录存储桶的名称。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/*" ], "Sid": "AllowS3Putobject" } ] }

要设置 Amazon S3 存储桶来存储来自 AWS CLI 的日志,请在启动作业运行时使用 s3MonitoringConfiguration 配置。为此,请在配置中提供以下 --configuration-overrides

{ "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://amzn-s3-demo-logging-bucket/logs/" } } }

对于未启用重试的批处理作业,EMR Serverless 会将日志发送到以下路径:

'/applications/<applicationId>/jobs/<jobId>'

EMR Serverless 将 Spark 驱动程序日志存储在以下路径中

'/applications/<applicationId>/jobs/<jobId>/SPARK_DRIVER/'

EMR Serverless 将 Spark 执行程序日志存储在以下路径中

'/applications/<applicationId>/jobs/<jobId>/SPARK_EXECUTOR/<EXECUTOR-ID>'

<EXECUTOR-ID> 是一个整数。

EMR Serverless 7.1.0 及更高版本支持流处理作业和批处理作业重试。如果您在启用重试的情况下运行作业,EMR Serverless 会自动在日志路径前缀中添加重试编号,以便更好地区分和跟踪日志。

'/applications/<applicationId>/jobs/<jobId>/attempts/<attemptNumber>/'

使用 Amazon CloudWatch 的 EMR Serverless 日志记录

向 EMR Serverless 应用程序提交作业时,请选择 Amazon CloudWatch 来存储应用程序日志。这样您就可以使用 CloudWatch 日志分析功能,如 CloudWatch Logs Insights 和 Live Tail。您还可以将日志从 CloudWatch 流式传输到其他系统(如 OpenSearch),以便进一步分析。

EMR Serverless 可实时记录驱动程序日志。您可以使用 CloudWatch Live Tail 功能或通过 CloudWatch CLI tail 命令实时访问日志。

默认情况下,EMR Serverless 禁用了 CloudWatch 日志记录。若要启用,请使用 AWS CLI 中的配置。

注意

Amazon CloudWatch 会实时发布日志,因此会占用更多工作线程资源。如果您选择较小的工作线程容量,可能会增加作业运行延迟。如果启用了 CloudWatch 日志记录,建议您选择更大的工作线程容量。如果每秒事务数(TPS)速率对于 PutLogEvents 来说太低,日志发布也可能会受到限制。CloudWatch 节流配置对所有服务是全局性的,包括 EMR Serverless。有关更多信息,请参阅 AWS re:post 上的如何确定 CloudWatch Logs 的节流情况?

使用 CloudWatch 进行日志记录所需的权限

在作业将日志数据发送到 Amazon CloudWatch 之前,请在作业运行时角色的权限策略中包含以下权限。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:DescribeLogGroups" ], "Resource": [ "arn:aws:logs:*:123456789012:*" ], "Sid": "AllowLOGSDescribeloggroups" }, { "Effect": "Allow", "Action": [ "logs:PutLogEvents", "logs:CreateLogGroup", "logs:CreateLogStream", "logs:DescribeLogStreams" ], "Resource": [ "arn:aws:logs:*:123456789012:log-group:my-log-group-name:*" ], "Sid": "AllowLOGSPutlogevents" } ] }

AWS CLI

要设置 Amazon CloudWatch 来存储来自 AWS CLI 的 EMR Serverless 日志,请在启动作业运行时使用 cloudWatchLoggingConfiguration 配置。为此,请提供以下配置覆盖。或者,还请提供日志组名称、日志流前缀名称、日志类型和加密密钥 ARN。

如果未指定可选值,CloudWatch 将使用默认日志流 /applications/applicationId/jobs/jobId/worker-type 将日志发布到默认日志组 /aws/emr-serverless

EMR Serverless 7.1.0 及更高版本支持流处理作业和批处理作业重试。如果作业启用了重试,EMR Serverless 会自动在日志路径前缀中添加重试编号,以便更好地区分和跟踪日志。

'/applications/<applicationId>/jobs/<jobId>/attempts/<attemptNumber>/worker-type'

下面展示了使用 EMR Serverless 的默认设置开启 Amazon CloudWatch 日志记录所需的最低配置:

{ "monitoringConfiguration": { "cloudWatchLoggingConfiguration": { "enabled": true } } }

以下示例显示了在为 EMR Serverless 开启 Amazon CloudWatch 日志记录时指定的所有必需和可选配置。示例下方还列出了支持的 logTypes 值。

{ "monitoringConfiguration": { "cloudWatchLoggingConfiguration": { "enabled": true, // Required "logGroupName": "Example_logGroup", // Optional "logStreamNamePrefix": "Example_logStream", // Optional "encryptionKeyArn": "key-arn", // Optional "logTypes": { "SPARK_DRIVER": ["stdout", "stderr"] //List of values } } } }

默认情况下,EMR Serverless 仅将驱动程序 stdout 和 stderr 日志发布到 CloudWatch。如果需要其他日志,请在 logTypes 字段中指定容器角色和相应的日志类型。

以下列表显示了为 logTypes 配置指定的受支持工作线程类型:

Spark
  • SPARK_DRIVER : ["STDERR", "STDOUT"]

  • SPARK_EXECUTOR : ["STDERR", "STDOUT"]

Hive
  • HIVE_DRIVER : ["STDERR", "STDOUT", "HIVE_LOG", "TEZ_AM"]

  • TEZ_TASK : ["STDERR", "STDOUT", "SYSTEM_LOGS"]