保存时挂起的 Spark Dataframe

Spark Dataframe hanging on save

我一直在努力找出我的 spark 作业有什么问题,它无限期地挂在我尝试将其写出到 S3 或 HDFS(约 100G 镶木地板格式的数据)的地方。

导致挂起的行:

spark_df.write.save(MY_PATH,format='parquet',mode='append')

我已经在覆盖和附加模式下尝试过,并尝试保存到 HDFS 和 S3,但无论如何作业都会挂起。

在 Hadoop 资源管理器 GUI 中,它将 spark 应用程序的状态显示为 "RUNNING",但看起来似乎 Spark 实际上没有做任何事情,当我查看 Spark 时UI 没有工作 运行。

让它工作的一件事是在集群处于挂起状态时增加集群的大小(我在 AWS 上)。然而,如果我从 6 个工人开始集群并增加到 7 个,或者如果我从 7 个开始增加到 8 个,这对我来说似乎有些奇怪,这并不重要。在这两种情况下,集群都在使用所有可用内存,但我没有收到内存错误。

对可能出现的问题有什么想法吗?

感谢大家的帮助。我最终发现问题实际上是几个不同的问题。以下是我对它们的理解:

当我直接保存到 S3 时,这与 Steve Loughran 提到的 S3 上的重命名非常慢的问题有关(所以看起来我的集群什么都不做)。在写入 S3 时,所有数据都被复制到临时文件,然后 "renamed" 在 S3 上——问题是重命名不会像在文件系统上那样发生,实际上需要 O(n) 时间。所以我所有的数据都被复制到 S3,然后所有的时间都花在了重命名文件上。

我面临的另一个问题是将数据保存到 HDFS,然后通过 s3-dist-cp 将其移动到 S3。我的所有集群资源都被 Spark 使用,因此当 Application Master 尝试提供资源以通过 s3-dist-cp 将数据移动到它时,它无法做到。由于 Spark,数据的移动不会发生,而且 Spark 不会关闭,因为我的程序仍在尝试将数据复制到 S3(因此它们被锁定)。

希望这可以帮助到其他人!