如何解决 AWS Glue 中的“java.lang.OutOfMemoryError: Java heap space”错误?

上次更新时间:2020 年 6 月 19 日

我的 AWS Glue 作业运行失败,提示“Command failed with exit code 1”,且 Amazon CloudWatch Logs 显示“java.lang.OutOfMemoryError: Java heap space”错误。

简短描述

“java.lang.OutOfMemoryError: Java heap space”错误表示驱动程序或执行程序进程耗尽内存。要确定是驱动程序还是执行程序导致了 OOM,请参阅调试 OOM 异常和作业异常。以下解决方法仅适用于驱动程序 OOM 异常。

解决方法

在 Apache Spark 作业从 Amazon Simple Storage Service (Amazon S3) 读取大量小文件时,往往会发生驱动程序 OOM 异常。可使用以下一种或多种方法解决 DynamicFrames 的驱动程序 OOM 异常问题。

分组

启用分组功能后,任务将处理多个文件而不是单个文件。有关更多信息,请参阅使用分组修复多个文件的处理

启用 useS3ListImplementation

当 AWS Glue 列出文件时,它会在驱动程序内存中创建文件索引。如以下示例所示,当您将 useS3ListImplementation 设置为 True 时,AWS Glue 不会一次性在内存中缓存所有文件列表,而是分批缓存列表。这意味着驱动程序耗尽内存的可能性较低。

以下是如何使用 from_catalog 启用 useS3ListImplementation 的示例:

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "database", table_name = "table", additional_options = {'useS3ListImplementation': True}, transformation_ctx = "datasource0")

以下是如何使用 from_options 启用 useS3ListImplementation 的示例:

datasource0 = glueContext.create_dynamic_frame.from_options(connection_type="s3", connection_options = {"paths": ["s3://input_path"], "useS3ListImplementation":True,"recurse":True}, format="json")

useS3ListImplementation 功能是 Amazon S3 ListKeys 操作的一种实现,用于将大型结果集拆分为多个响应。最佳实践是使用 useS3ListImplementation 与作业书签。

其他问题排查方法

如果分组和 useS3ListImplementation 方法无法解决驱动程序 OOM 异常问题,请尝试以下操作:

  • 使用 CloudWatch Logs 和 CloudWatch 指标来分析驱动程序内存。设置 CloudWatch 警报,以便在您的作业超出特定阈值时向提醒您。
  • 避免使用 collectcount 之类的操作。这些操作会收集驱动程序的结果,从而可能会导致驱动程序 OOM 异常。
  • 分析您的数据集,然后为您的作业选择正确的工作线程类型。考虑扩展到 G.1X 或 G.2X。