Spark EMR从S3读取转换并写回S3,需要性能改进



使用AWS EMR集群

场景:

  1. 我需要从S3读取输入的镶木地板文件
  2. 对数据做一些转换,我用Spark SQL做
  3. 我需要将输出文件(multiplart parquet(写回S3
  • 输入数据量:30GB
  • 输出容量:500GB

我使用1个主节点-m5.8xlarge和7个r5.12xlarge类型的核心节点。

我尝试在步骤3中直接将文件写入S3,也尝试写入本地文件并将其移动到S3。直接写入S3需要更多的时间。

  • 直接写入S3的时间=5小时
  • 写入本地并移动到S3的时间=4小时
  1. 我尝试使用m4.2xlarge Master,EBS为600GB,10核r5.2xlarge,并尝试将文件写入/mnt/path。但是,集群核心节点由于空间问题而出现故障。有没有办法,我可以要求核心节点在主节点的EBS卷上写入文件

由于步骤3中的文件总大小>500GB,我必须使用r5.12xlarge实例。对于较低的实例,它会出现内存不足的问题。

我不会对dataFrame进行重新分区以避免数据溢出。只是做dataFrame.write.parquet(路径(

  1. 是否有其他主机/核心/EBS组合可获得最佳性能

请为我的场景建议最佳组合。

避免重新划分并不总是好的,在数据倾斜的情况下,数据帧重新划分将在您身边。请参见此处。

所以,让我们从你的spark工作开始,首先你需要通过spark ui分析你的工作,这将帮助你检测任何数据倾斜、混乱和任何其他与spark相关的瓶颈。请参见此处。

此外,根据您的工作,您可能需要缓存数据帧,请参阅此答案以检查您是否真的需要它。

如果您已经检查了所有常见的火花优化,根据您的EMR版本,请检查这两种配置,并确保它们已启用:最大化资源分配和emr-spark-s3-优化提交

最新更新