本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
具有有界执行的工作负载分区
Spark 应用程序中的错误通常是由于效率低下的 Spark 脚本、大规模转换的分布式内存中执行,以及数据集异常引起的。有很多原因可能会导致驱动程序或执行程序内存不足问题,例如数据偏斜、列出太多的对象或大量数据随机排序。当您使用 Spark 处理大量积压数据时,通常会出现这些问题。
Amazon Glue 可让您解决 OOM 问题,并通过工作负载分区使您的 ETL 处理工作更加轻松。启用工作负载分区后,每个 ETL 任务运行仅拾取未处理的数据,数据集大小或此任务运行要处理的文件数有一个上限。以后的任务运行将处理剩余的数据。例如,如果需要处理 1000 个文件,则可以将文件数设置为 500,并将它们分成两次任务运行。
仅 Amazon S3 数据源支持工作负载分区。
启用工作负载分区
您可以通过手动设置脚本中的选项或添加目录表属性来启用有界执行。
要在脚本中启用具有有界执行的工作负载分区,请执行以下操作:
-
要避免重新处理数据,请在新任务或现有任务中启用任务书签。有关更多信息,请参阅使用任务书签来跟踪已处理的数据。
-
修改脚本并在 Amazon Glue
getSource
API 中设置其他选项中的有界限制。您还应该为任务书签设置转换上下文,以存储state
元素。例如:Python
glueContext.create_dynamic_frame.from_catalog( database = "database", table_name = "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", "")
要在数据目录表中启用具有有界执行的工作负载分区,请执行以下操作:
-
在数据目录中的表结构的
parameters
字段中设置键值对。有关更多信息,请参阅查看和编辑表详细信息。 -
设置数据集大小或处理的文件数量的上限:
将
boundedSize
设置为数据集的目标大小(以字节为单位)。任务运行将在达到表中的目标大小后停止。将
boundedFiles
设置为目标文件数。处理目标数量的文件后,任务运行将停止。
注意
您应该只设置一个
boundedSize
或boundedFiles
,因为仅支持单个界限。
设置一个 Amazon Glue 触发器以自动运行作业
启用有界执行后,您可以设置 Amazon Glue 触发器以自动运行任务,并在顺序运行中以增量方式加载数据。转至 Amazon Glue 控制台并创建触发器,设置计划时间,然后附加到您的任务。然后,它将自动触发下一个任务运行并处理新一批数据。
您还可以使用 Amazon Glue 工作流来编排多个任务,以并行处理来自不同分区的数据。有关更多信息,请参阅 Amazon Glue 触发器和 Amazon Glue 工作流。
有关使用案例和选项的更多信息,请参阅博客 Optimizing Spark applications with workload partitioning in Amazon Glue