如何克服 AWS Glue 作业中的 Spark“设备上没有剩余空间”错误

Posted

技术标签:

【中文标题】如何克服 AWS Glue 作业中的 Spark“设备上没有剩余空间”错误【英文标题】:How to overcome Spark "No Space left on the device" error in AWS Glue Job 【发布时间】:2021-04-05 06:40:09 【问题描述】:

我曾使用带有 PySpark 的 AWS Glue 作业从超过 10 TB 的 s3 parquet 文件中读取数据,但在执行 Spark SQL 查询期间作业失败并出现错误

java.io.IOException: No space left on the device

经过分析,我发现 AWS Glue worker G1.x 有 4 个 vCPU、16 GB 内存、64 GB 磁盘。所以我们试图增加工人的数量

即使将 Glue 工作器 (G1.X) 的数量增加到 50 个,Glue Jobs 仍然会因相同的错误而失败。

有没有办法将 Spark 本地临时目录配置为 s3 而不是本地文件系统?或者我们可以在 Glue 工作人员上挂载 EBS 卷。

我曾尝试在 Spark Session 构建器中配置该属性,但 Spark 仍在使用本地 tmp 目录

SparkSession.builder.appName("app").config("spark.local.dir", "s3a://s3bucket/temp").getOrCreate()

【问题讨论】:

我不确定这是否与 Glue 相同,但每当我遇到 EMR 问题时,都是由于大量日志记录到日志文件。或者您可以尝试增加分配给每个工作人员的磁盘空间。 @user238607 - 我没有找到增加 Glue Worker 磁盘 spack 的选项,是否可以这样做。 s3 不是真正的文件系统。甚至不要尝试 【参考方案1】:

根据错误消息,在写入 DynamicFrame 时,Glue 作业似乎磁盘空间不足。 您可能知道,Spark 将对某些操作执行 shuffle,将结果写入磁盘。当 shuffle 过大时,作业会失败并

有 2 个选项可供考虑。

    将您的工作人员类型升级到 G.2X 和/或增加工作人员的数量。

    使用 S3 [1] 实现 AWS Glue Spark Shuffle 管理器。要实施此选项,您需要降级到 Glue 版本 2.0。 Glue Spark shuffle manager 会将 shuffle-files 和 shuffle-spills 数据写入 S3,从而降低您的作业内存不足和失败的可能性。 请您添加以下附加作业参数。您可以通过以下步骤做到这一点:

在 Glue 控制台中打开“作业”选项卡。
    选择要应用此功能的作业,然后单击“操作”,然后单击“编辑作业”。 向下滚动并打开名为“安全配置、脚本库和作业参数(可选)”的下拉菜单。 在作业参数下,输入以下键值对:
键:--write-shuffle-files-to-s3 值:true 键:--write-shuffle-spills-to-s3 值:真 键:--conf 值: spark.shuffle.glue.s3ShuffleBucket=S3://

记得将三角括号 替换为您要存储随机播放数据的 S3 存储桶的名称。 5) 点击“保存”然后运行作业。

【讨论】:

【参考方案2】:

documentation 声明 spark.local.dir 仅用于指定 本地 目录。

可以通过修改 logging properties 或根据使用的集群管理器修改 cluster manager properties(例如 for yarn in this answer)来解决此错误。

【讨论】:

以上是关于如何克服 AWS Glue 作业中的 Spark“设备上没有剩余空间”错误的主要内容,如果未能解决你的问题,请参考以下文章

AWS Glue - Spark 作业 - 如何增加内存限制或更有效地运行?

从aws glue pyspark作业中的s3加载JSON

优化 Spark AWS GLUE 作业

从 EMR 迁移到 AWS Glue 后在 Spark SQL 中找不到表

AWS Glue 作业内存不足

将 AWS Glue 作业迁移到 EC2