EMR Serverless 作业弹性 - Amazon EMR

EMR Serverless 作业弹性

EMR Serverless 7.1.0 及更高版本包含对作业弹性的支持,可自动重试任何失败的作业,而无需任何手动输入。作业弹性的另一个好处是,如果一个可用区(AZ)出现任何问题,EMR Serverless 会将作业运行转移到其他可用区(AZ)。

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

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

当 EMR Serverless 尝试重新运行作业时,还会使用尝试编号对该作业编制索引,以便跟踪作业尝试期间的生命周期。

您可以使用 EMR Serverless API 操作或 AWS CLI 来更改作业弹性,或查看作业弹性相关的信息。有关更多信息,请参阅 EMR Serverless API 指南

默认情况下,EMR Serverless 不会重新运行批处理作业。要启用批处理作业重试,请在开始批处理作业运行时配置 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 停止重试前一小时内允许的最大失败尝试次数。默认为 5 次。可接受的值为 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,您可以使用该 URL 访问作业运行的应用程序 UI。attempt 参数允许您获取特定尝试的 URL。如果不包含 attempt 参数,该操作将返回有关最新尝试的信息。

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

使用重试策略监控作业

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

使用重试策略记录日志

每次 EMR Serverless 重试作业时,都会生成自己的日志集。为了确保 EMR Serverless 能够将这些日志成功传输到 Amazon S3 和 Amazon CloudWatch,而不覆盖任何日志,EMR Serverless 在 S3 日志路径和 CloudWatch 日志流名称的格式中添加了前缀,包含作业的尝试编号。

下面是该格式的一个示例。

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

此格式可确保 EMR Serverless 将每次作业尝试的所有日志发布到 Amazon S3 和 CloudWatch 中的指定位置。有关更多详细信息,请参阅存储日志

注意

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