具有限制执行的工作负载分区 - AWS Glue
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

具有限制执行的工作负载分区

Spark 应用程序中的错误通常是由于效率低下的 Spark 脚本、大规模转换的分布式内存中执行以及数据集异常引起的。有很多原因可能会导致驱动程序或执行程序内存不足问题,例如数据偏斜、列出太多的对象或大数据混乱。当您使用 Spark 处理大量积压数据时,通常会出现这些问题。

借助 AWS Glue,您可以通过工作负载分区解决 OOM 问题并使 ETL 处理更加轻松。启用工作负载分区后,每个 ETL 作业运行仅选取未处理的数据,并且对数据集大小或要在此作业运行中处理的文件数量有上限。将来的作业运行将处理剩余的数据。例如,如果需要处理 1000 个文件,则可以将文件数设置为 500,并将它们分成两次作业运行。

仅 Amazon S3 数据源支持工作负载分区。

启用工作负载分区

您可以通过手动设置脚本中的选项或添加目录表属性来启用有界执行。

要在脚本中启用带有限执行的工作负载分区,请执行以下操作:

  1. 要避免重新处理数据,请在新作业或现有作业中启用作业书签。有关更多信息,请参阅 。使用作业书签来跟踪已处理的数据

  2. 修改您的脚本并在 AWS Glue 中的其他选项中设置限制getSourceAPI。您还应该为作业书签设置转换上下文,以存储state元素。例如:

    Python

    glueContext.create_dynamic_frame.from_catalog( database = "database", tableName = "table_name", redshift_tmp_dir = "", transformation_ctx = "datasource0", additional_options = { "boundedFiles" : "500", # need to be string # "boundedSize" : "1000000000" unit is byte } )

    Scala

    val datasource0 = glueContext.getCatalogSource( database = "database", tableName = "table_name", redshiftTmpDir = "", transformationContext = "datasource0", additionalOptions = JsonOptions( Map("boundedFiles" -> "500") // need to be string //"boundedSize" -> "1000000000" unit is byte ) ).getDynamicFrame()
    val connectionOptions = JsonOptions( Map("paths" -> List(baseLocation), "boundedFiles" -> "30") ) val source = glueContext.getSource("s3", connectionOptions, "datasource0", "")

要在数据目录表中启用带有限执行的工作负载分区,请执行以下操作:

  1. 将键值对设置为parameters字段中的表结构。有关更多信息,请参阅 。查看和编辑表详细信息

  2. 设置数据集大小或处理的文件数量的上限:

    • SetboundedSize设置为数据集的目标大小 (以字节为单位)。从表达到目标大小后,作业运行将停止。

    • SetboundedFiles设置为目标文件数。处理目标数量的文件后,作业运行将停止。

    注意

    您应该只设置一个boundedSize或者boundedFiles,因为仅支持单个边界。

设置 AWS Glue 触发器以自动运行作 Job

启用限制执行后,您可以设置 AWS Glue 触发器以自动运行作业,并在顺序运行中以增量方式加载数据。转到 AWS Glue 控制台并创建触发器,设置计划时间,然后附加到您的任务。然后,它将自动触发下一个作业运行并处理新的一批数据。

您还可以使用 AWS Glue 工作流来协调多个作业,以便并行处理来自不同分区的数据。有关更多信息,请参阅 。AWS Glue 触发器AWS Glue 工作流

有关使用案例和选项的更多信息,请参阅博客使用 AWS Glue 中的工作负载分区优化 Spark 应用程序