如何克服 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,从而降低您的作业内存不足和失败的可能性。 请您添加以下附加作业参数。您可以通过以下步骤做到这一点:
-
选择要应用此功能的作业,然后单击“操作”,然后单击“编辑作业”。
向下滚动并打开名为“安全配置、脚本库和作业参数(可选)”的下拉菜单。
在作业参数下,输入以下键值对:
记得将三角括号 替换为您要存储随机播放数据的 S3 存储桶的名称。 5) 点击“保存”然后运行作业。
【讨论】:
【参考方案2】:documentation 声明 spark.local.dir
仅用于指定 本地 目录。
可以通过修改 logging properties 或根据使用的集群管理器修改 cluster manager properties(例如 for yarn in this answer)来解决此错误。
【讨论】:
以上是关于如何克服 AWS Glue 作业中的 Spark“设备上没有剩余空间”错误的主要内容,如果未能解决你的问题,请参考以下文章
AWS Glue - Spark 作业 - 如何增加内存限制或更有效地运行?