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

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

使用有界执行进行工作负载分区

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

AWS Glue 使您能够解决 OOM 问题,并使用工作负载分区简化 ETL 处理。启用工作负载分区后,每个 ETL 作业运行仅选择未处理的数据,数据集大小或此作业运行时处理的文件数具有上限。未来的作业运行将处理剩余的数据。例如,如果需要处理 1000 个文件,您可以将文件数设置为 500 并将其拆分为两个作业运行。

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

启用工作负载分区

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

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

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

  2. 修改脚本并在 AWS Glue getSource API 中的其他选项中设置绑定限制。您还应设置作业书签的转换上下文以存储 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", "")

要在 Data Catalog 表中启用具有有界执行的工作负载分区,请执行以下操作:

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

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

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

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

    注意

    您只能设置 boundedSizeboundedFiles 之一,因为仅支持单个边界。

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

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

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

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