我曾使用 AWS Glue 作业和 PySpark 从超过 10 TB 的 s3 parquet 文件中读取数据,但作业在执行 Spark SQL 查询期间失败并出现错误
java.io.IOException: No space left on the device
Run Code Online (Sandbox Code Playgroud)
通过分析,我发现 AWS Glue 工作人员G1.x有 4 个 vCPU、16 GB 内存和 64 GB 磁盘。所以我们试图增加工人的数量
即使在将 Glue 工作器 (G1.X) 的数量增加到 50 之后,Glue Jobs 仍会因相同的错误而失败。
有没有办法将 Spark 本地临时目录配置为 s3 而不是本地文件系统?或者我们可以在 Glue 工人上安装 EBS 卷。
我曾尝试在 Spark Session builder 中配置该属性,但 Spark 仍在使用本地 tmp 目录
SparkSession.builder.appName("app").config("spark.local.dir", "s3a://s3bucket/temp").getOrCreate()
Run Code Online (Sandbox Code Playgroud)
Mar*_*nal 10
正如@Prajappati所说,有多种解决方案。
这些解决方案在介绍 s3 shuffle 功能的 aws 博客中有详细描述。我将省略洗牌配置调整,因为它不太可靠。所以,基本上,您可以:
垂直扩展,增加机器的尺寸(即从 G.1X 到 G.2X),从而增加成本。
分解计算和存储:在本例中意味着使用 s3 作为溢出和洗牌的存储服务。
在撰写本文时,要配置此分解,必须使用以下设置来配置作业:
范围 | 价值 | 解释 |
---|---|---|
--write-shuffle-files-to-s3 | 真的 | 主要参数(必填) |
--write-shuffle-spills-to-s3 | 真的 | 选修的 |
--conf | Spark.shuffle.glue.s3ShuffleBucket=S3://<您的存储桶名称>/<您的路径> | 选修的。如果未设置,将使用路径--TempDir /shuffle-data |
请记住为作业分配适当的 iam 权限,以访问存储桶并在默认提供或配置的 s3 路径下进行写入。
小智 6
根据错误消息,在写入 DynamicFrame 时,Glue 作业似乎磁盘空间不足。您可能知道,Spark 会对某些操作执行 shuffle,并将结果写入磁盘。当 shuffle 太大时,作业将会失败
有 2 个选项可供考虑。
将您的工作人员类型升级到 G.2X 和/或增加工作人员数量。
使用 S3 实施 AWS Glue Spark Shuffle 管理器 [1]。要实施此选项,您需要降级到 Glue 版本 2.0。Glue Spark 洗牌管理器会将洗牌文件和洗牌溢出数据写入 S3,从而降低作业内存不足和失败的可能性。请您添加以下附加作业参数。您可以通过以下步骤执行此操作:
请记住将三角括号 <> 替换为您要存储 shuffle 数据的 S3 存储桶的名称。5) 单击“保存”然后运行作业。
归档时间: |
|
查看次数: |
952 次 |
最近记录: |