EMR 无服务器作业运行取消且有宽限期 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

EMR 无服务器作业运行取消且有宽限期

在数据处理系统中,突然终止可能导致资源浪费、操作不完整和潜在的数据不一致。Amazon EMR Serverless 允许您在取消任务运行时指定宽限期。此功能允许在任务终止之前有时间进行适当的清理和完成正在进行的工作。

取消作业运行时,您可以使用参数指定宽限期(以秒为单位),shutdownGracePeriodInSeconds在此期间,作业可以在最终终止之前执行清理操作。批处理作业和流式处理作业的行为和默认设置各不相同。

批处理作业的宽限期

对于批处理作业,EMR Serverless 允许您实现宽限期内执行的自定义清理操作。您可以在应用程序代码中将这些清理操作注册为 JVM 关闭挂钩的一部分。

默认行为

关闭的默认行为是没有宽限期。它由以下两个操作组成:

  • 立即终止

  • 资源会立即释放

配置选项

您可以指定导致正常关闭的设置:

  • 关机宽限期的有效范围:15-1800 秒(可选)

  • 立即终止(没有任何宽限期):0 秒

启用优雅关机

要实现批处理作业的正常关闭,请执行以下步骤:

  1. 在包含自定义关闭逻辑的应用程序代码中添加关机挂钩。

    Example in Scala
    import org.apache.hadoop.util.ShutdownHookManager // Register shutdown hook with priority (second argument) // Higher priority hooks run first ShutdownHookManager.get().addShutdownHook(() => { logger.info("Performing cleanup operations...") }, 100)

    使用 ShutdownHookManager

    Example in PySpark
    import atexit def cleanup(): # Your cleanup logic here print("Performing cleanup operations...") # Register the cleanup function atexit.register(cleanup)
  2. 取消任务时指定宽限期,以便有时间执行上面添加的挂钩

    示例

    # Default (immediate termination) aws emr-serverless cancel-job-run \ --application-id APPLICATION_ID \ --job-run-id JOB_RUN_ID # With 5-minute grace period aws emr-serverless cancel-job-run \ --application-id APPLICATION_ID \ --job-run-id JOB_RUN_ID \ --shutdown-grace-period-in-seconds 300

直播作业的宽限期

在 Spark 结构化流中,计算涉及读取或写入外部数据源,突然关闭可能会导致不想要的结果。流式作业以微批量处理数据,而中途中断这些操作可能会导致后续尝试中的重复处理。当没有写入之前的微批处理中的最新检查点时,就会发生这种情况,从而导致在流式处理作业重新启动时再次处理相同的数据。这种重复处理不仅会浪费计算资源,还会影响业务运营,因此避免突然停机至关重要。

EMR Serverless 为通过流式查询侦听器进行优雅关闭提供了内置支持。这样可以确保在任务终止之前正确完成正在进行的微批处理。该服务可自动管理流式处理应用程序的微批次之间的正常关闭,确保当前的微批处理完成处理,正确写入检查点,并且在关闭过程中无需摄取新数据即可干净地终止流式传输上下文,而无需摄取新数据。

默认行为

  • 默认情况下启用 120 秒的宽限期。

  • 内置的流式查询监听器可管理正常关机。

配置选项

  • 关机宽限期的有效范围:15-1800 秒(可选)

  • 立即终止:0 秒

启用优雅关机

要实现流媒体作业的优雅关闭,请执行以下操作:

取消任务时指定宽限期,以便有时间完成正在进行的微批处理。

示例

# Default graceful shutdown (120 seconds) aws emr-serverless cancel-job-run \ --application-id APPLICATION_ID \ --job-run-id JOB_RUN_ID # Custom grace period (e.g. 300 seconds) aws emr-serverless cancel-job-run \ --application-id APPLICATION_ID \ --job-run-id JOB_RUN_ID \ --shutdown-grace-period-in-seconds 300 # Immediate Termination aws emr-serverless cancel-job-run \ --application-id APPLICATION_ID \ --job-run-id JOB_RUN_ID \ --shutdown-grace-period-in-seconds 0

添加自定义关机挂钩(可选)

虽然 EMR Serverless 默认通过其内置的流式查询侦听器管理正常关闭,但您可以选择为单个流式查询实现自定义关闭逻辑。EMR Serverless 将其优雅关闭侦听器注册为优先级 60(使用)。 ShutdownHookManager由于优先级较高的挂钩首先运行,因此您可以注册优先级大于 60 的自定义清理操作,以确保它们在 EMR Serverless 的关闭过程开始之前执行。

要添加自定义挂钩,请参阅本主题中的第一个示例,该示例展示了如何在应用程序代码中添加关闭挂钩。在这里,优先级为 100,大于 60。因此,这样的关机挂钩将首先运行。

注意

自定义关机挂钩是可选的,并不是优雅关闭功能所必需的,该功能由 EMR Serverless 自动处理。

宽限期费用和 Batch 持续时间

如果使用宽限期(120 秒)的默认值:

  • 如果您的批处理持续时间少于 120 秒,则只需按完成批次所需的实际时间向您收费。

  • 如果您的批处理持续时间超过 120 秒,则将按最大宽限期(120 秒)向您收费,但查询可能无法正常关闭,因为它将被强制终止。

要优化成本并确保正常关机,请执行以下操作:

  • 对于大于 120 秒的批处理持续时间:考虑延长宽限期以匹配您的批处理持续时间

  • 对于小于 120 秒的批处理时长:无需调整宽限期,因为您只需按实际处理时间付费

注意事项

宽限期行为

  • 宽限期为您注册的关闭挂钩提供了完成的时间。

  • 即使早在宽限期之前,Job 也会在关机挂钩完成后立即终止。

  • 如果清理操作超过宽限期,则作业将被强制终止。

服务行为

  • 宽限期关闭仅适用于处于 “运行” 状态的作业。

  • 在 “取消” 状态下后续的取消请求将被忽略。

  • 如果 EMR Serverless 由于内部服务错误而无法启动宽限期关闭:

    • 该服务将重试最多 2 分钟。

    • 如果重试失败,则任务将被强制终止。

计费

在任务完全关闭之前,包括宽限期内所花费的任何时间,均按使用的计算资源计费。