EMR无服务器 Job 弹性 - Amazon EMR

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

EMR无服务器 Job 弹性

EMRServerless 版本 7.1.0 及更高版本包括对作业弹性的支持,因此它会自动重试任何失败的作业,而无需您手动输入。作业弹性的另一个好处是,如果可用区遇到任何问题,EMRServerless 可以将作业运行转移到不同的可用区 (AZ)。

要为作业启用作业弹性,请为您的作业设置重试策略。重试策略可确保 EMR Serverless 在作业失败时自动重启该作业。批处理和流式处理作业都支持重试策略,因此您可以根据自己的用例自定义作业弹性。下表比较了批处理和流式作业之间作业弹性的行为和差异。

批处理作业 直播职位
默认行为 不重新运行作业。 始终重试运行作业,因为应用程序在运行作业时会创建检查点。
重试点 Batch 作业没有检查点,因此 EMR Serverless 总是从头开始重新运行作业。 流式处理作业支持检查点,因此您可以配置流式处理查询以保存运行时状态并进度到 Amazon S3 中的检查点位置。EMRServerless 从检查点恢复作业运行。有关更多信息,请参阅 Apache Spark 文档中的使用检查点从故障中恢复
最大重试次数 最多允许 10 次重试。 流式传输作业具有内置的抖动预防控制功能,因此,如果作业在一小时后继续失败,应用程序将停止重试作业。一小时内的默认重试次数为五次尝试。您可以将此重试次数配置为 1 或 10 之间。您无法自定义最大尝试次数。值为 1 表示不重试。

当 EMR Serverless 尝试重新运行作业时,它还会使用尝试次数为该作业编制索引,这样您就可以在尝试中跟踪作业的生命周期。

你可以使用EMR无服务器API操作或 AWS CLI 更改工作弹性或查看与工作弹性相关的信息。有关更多信息,请参阅EMR无服务器API指南

默认情况下,EMRServerless 不会重新运行批处理作业。要启用批处理作业的重试功能,请在启动批处理作业运行时配置maxAttempts参数。该maxAttempts参数仅适用于批处理作业。默认值为 1,这意味着不重新运行作业。可接受的值为 1 到 10(含)。

以下示例演示了如何在启动作业运行时指定最多 10 次尝试次数。

aws emr-serverless start-job-run --application-id <APPLICATION_ID> \ --execution-role-arn <JOB_EXECUTION_ROLE> \ --mode 'BATCH' \ --retry-policy '{ "maxAttempts": 10 }' \ --job-driver '{ "sparkSubmit": { "entryPoint": "/usr/lib/spark/examples/jars/spark-examples-does-not-exist.jar", "entryPointArguments": ["1"], "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi" } }'

EMR如果流媒体作业失败,Serverless 会无限期地重试这些作业。要防止由于重复出现不可恢复的故障而导致抖动,请使用为流式处理maxFailedAttemptsPerHour作业重试配置抖动防护控制。此参数允许您指定在 EMR Serverless 停止重试前一小时内允许的最大失败尝试次数。默认值为五。可接受的值为 1 到 10(含)。

aws emr-serverless start-job-run --application-id <APPPLICATION_ID> \ --execution-role-arn <JOB_EXECUTION_ROLE> \ --mode 'STREAMING' \ --retry-policy '{ "maxFailedAttemptsPerHour": 7 }' \ --job-driver '{ "sparkSubmit": { "entryPoint": "/usr/lib/spark/examples/jars/spark-examples-does-not-exist.jar", "entryPointArguments": ["1"], "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi" } }'

您还可以使用其他作业运行API操作来获取有关作业的信息。例如,您可以将attempt参数与GetJobRun操作配合使用,以获取有关特定任务尝试的详细信息。如果不包含attempt参数,则该操作将返回有关最新尝试的信息。

aws emr-serverless get-job-run \ --job-run-id job-run-id \ --application-id application-id \ --attempt 1

ListJobRunAttempts操作会返回与作业运行相关的所有尝试的相关信息。

aws emr-serverless list-job-run-attempts \ --application-id application-id \ --job-run-id job-run-id

GetDashboardForJobRun操作会创建并返回一个URL,您可以使用它来访问应用程序UIs以运行作业。该attempt参数允许您URL针对特定尝试获取。如果不包含attempt参数,则该操作将返回有关最新尝试的信息。

aws emr-serverless get-dashboard-for-job-run \ --application-id application-id \ --job-run-id job-run-id \ --attempt 1

使用重试策略监控作业

作业弹性支持还添加了新的EMR无服务器作业运行重试事件。EMRServerless 会在每次重试作业时发布此事件。您可以使用此通知来跟踪任务的重试次数。有关事件的更多信息,请参阅 Amazon EventBridge 事件

使用重试策略进行登录

每当 EMR Serverless 重试作业时,该尝试都会生成自己的日志集。为了确保 S EMR erverless 能够在不覆盖任何日志 CloudWatch 的情况下成功将这些日志传输到 Amazon S3 和 Amazon,S EMR erverless 在 S3 日志路径和 CloudWatch 日志流名称的格式中添加了一个前缀,以包含任务的尝试次数。

以下是格式的示例。

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

这种格式可确保 EMR Serverless 将每次尝试执行任务的所有日志发布到自己在 Amazon S3 中的指定位置和 CloudWatch。有关更多详细信息,请参阅存储日志

注意

EMRServerless 仅对所有流式处理作业和任何启用了重试的批处理作业使用此前缀格式。