【发布时间】:2021-09-13 11:40:40
【问题描述】:
使用 AWS EMR 集群。
场景:
- 我需要从 S3 读取 inpute parquet 文件
- 对数据做一些转换,我用 Spark SQL 做的
- 我需要将输出文件(multiplart parquet)写回 S3。
- 输入数据量:30GB
- 输出容量:500GB
我正在使用 1 个主节点 - m5.8xlarge 和 7 个 r5.12xlarge 类型的核心节点。
我尝试在步骤 3 中将文件直接写入 S3 以及写入本地文件并将它们移动到 S3。 直接写入 S3 需要更多时间。
- 直接写入 S3 的时间 = 5 小时
- 写入本地并移动到 S3 的时间 = 4 小时
- 我尝试使用具有 600GB 的 EBS 和 10 Core r5.2xlarge 的 m4.2xlarge Master,并尝试将文件写入 /mnt/ 路径。但是,集群核心节点由于空间问题而失败。 有什么办法可以让Core节点在Master节点的EBS卷上写文件?
由于步骤 3 中的文件总大小 >500GB,我必须使用 r5.12xlarge 实例。对于较低的实例,它会出现内存不足的问题。
我没有对 dataFrame 进行重新分区以避免数据混乱。只是在做 dataFrame.write.parquet(path)
- 任何其他 Master/Core/EBS 组合以获得最佳性能?
请为我的方案建议最佳组合。
【问题讨论】:
-
确保您使用的是 Amazon 优化的 S3 提交程序,否则任务和作业提交会逐个复制文件,这 (a) 不安全且 (b) 非常慢
-
我尝试从 s3a 更改为 s3,但它给出了 No FileSystem for scheme: s3 的例外。
标签: performance apache-spark amazon-s3 apache-spark-sql amazon-emr