使用AWS EMR集群
场景:
- 我需要从S3读取输入的镶木地板文件
- 对数据做一些转换,我用Spark SQL做
- 我需要将输出文件(multiplart parquet(写回S3
- 输入数据量:30GB
- 输出容量:500GB
我使用1个主节点-m5.8xlarge和7个r5.12xlarge类型的核心节点。
我尝试在步骤3中直接将文件写入S3,也尝试写入本地文件并将其移动到S3。直接写入S3需要更多的时间。
- 直接写入S3的时间=5小时
- 写入本地并移动到S3的时间=4小时
- 我尝试使用m4.2xlarge Master,EBS为600GB,10核r5.2xlarge,并尝试将文件写入/mnt/path。但是,集群核心节点由于空间问题而出现故障。有没有办法,我可以要求核心节点在主节点的EBS卷上写入文件
由于步骤3中的文件总大小>500GB,我必须使用r5.12xlarge实例。对于较低的实例,它会出现内存不足的问题。
我不会对dataFrame进行重新分区以避免数据溢出。只是做dataFrame.write.parquet(路径(
- 是否有其他主机/核心/EBS组合可获得最佳性能
请为我的场景建议最佳组合。
避免重新划分并不总是好的,在数据倾斜的情况下,数据帧重新划分将在您身边。请参见此处。
所以,让我们从你的spark工作开始,首先你需要通过spark ui分析你的工作,这将帮助你检测任何数据倾斜、混乱和任何其他与spark相关的瓶颈。请参见此处。
此外,根据您的工作,您可能需要缓存数据帧,请参阅此答案以检查您是否真的需要它。
如果您已经检查了所有常见的火花优化,根据您的EMR版本,请检查这两种配置,并确保它们已启用:最大化资源分配和emr-spark-s3-优化提交