【问题标题】:Spark EMR Read from S3 Transform and Write back to S3, Need Performance ImprovementSpark EMR 从 S3 读取转换并写回 S3,需要改进性能
【发布时间】:2021-09-13 11:40:40
【问题描述】:

使用 AWS EMR 集群。

场景:

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

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

我尝试在步骤 3 中将文件直接写入 S3 以及写入本地文件并将它们移动到 S3。 直接写入 S3 需要更多时间。

  • 直接写入 S3 的时间 = 5 小时
  • 写入本地并移动到 S3 的时间 = 4 小时
  1. 我尝试使用具有 600GB 的 EBS 和 10 Core r5.2xlarge 的 m4.2xlarge Master,并尝试将文件写入 /mnt/ 路径。但是,集群核心节点由于空间问题而失败。 有什么办法可以让Core节点在Master节点的EBS卷上写文件?

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

我没有对 dataFrame 进行重新分区以避免数据混乱。只是在做 dataFrame.write.parquet(path)

  1. 任何其他 Master/Core/EBS 组合以获得最佳性能?

请为我的方案建议最佳组合。

【问题讨论】:

  • 确保您使用的是 Amazon 优化的 S3 提交程序,否则任务和作业提交会逐个复制文件,这 (a) 不安全且 (b) 非常慢
  • 我尝试从 s3a 更改为 s3,但它给出了 No FileSystem for scheme: s3 的例外。

标签: performance apache-spark amazon-s3 apache-spark-sql amazon-emr


【解决方案1】:

避免重新分区并不总是好的,在数据​​偏斜的情况下,数据帧重新分区将在您身边。见here

所以让我们从您的 spark 工作开始,首先您需要通过 spark ui 分析您的工作,这将帮助您检测任何数据偏斜、改组和任何其他与 spark 相关的瓶颈。见here

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

如果您检查了所有常见的 spark 优化,请根据您的 EMR 版本检查这两个配置并确保它们已启用: maximizeResourceAllocationemr-spark-s3-optimized-committer

【讨论】:

  • 感谢@54I3d 的回复。您能否建议我有什么方法可以让核心节点在主节点的 EBS 卷上写入文件?还是在集群的一个地方?所以,我可以稍后将它们移动到 S3。
  • @ViralPatel 我不认为这是一个好主意,spark 被设计为并行工作,在同一台机器上编写是可能的,但你不会受益于 spark 的力量。我建议你继续努力增强您的 Spark 作业和您的 emr 配置。
  • 感谢您的回复。那么,将输出 parquet 部分文件直接写入 S3 会更好吗?
  • 确定!一个精心设计的 Spark 作业,具备上述所有要点,您将获得非常好的性能!
猜你喜欢
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
相关资源
最近更新 更多