保存时挂起的Spark Dataframe

TH2*_*H22 3 hadoop amazon-web-services amazon-emr apache-spark pyspark

我一直在努力寻找火花作业的问题,该火花作业无限期地挂在我尝试将其写到S3或HDFS(约100G拼花格式的数据)的地方。

导致挂起的行:

spark_df.write.save(MY_PATH,format='parquet',mode='append')
Run Code Online (Sandbox Code Playgroud)

我已经在覆盖模式和附加模式下进行了尝试,并尝试将其保存到HDFS和S3,但是无论如何,该工作都将挂起。

在Hadoop资源管理器GUI中,它将Spark应用程序的状态显示为“正在运行”,但是看起来Spark实际上并没有执行任何操作,当我查看Spark UI时,没有任何作业正在运行。

使它起作用的一件事是在处于挂起状态(我在AWS上)时增加集群的大小。但是,这与我是否以6个工人启动集群并增加到7个无关紧要,还是如果我以7个工人启动并增加到8个无关紧要,这对我来说似乎有些奇怪。在这两种情况下,群集都在使用所有可用的内存,但是我没有遇到内存错误。

关于可能出什么问题的任何想法?

TH2*_*H22 5

谢谢大家的帮助。我最终弄清楚了这个问题实际上是几个单独的问题。这是我对它们的理解:

当我直接保存到S3时,这与一个问题有关,史蒂夫·拉夫兰(Steve Loughran)提到了S3上的重命名速度非常慢的现象(因此看来我的集群没有执行任何操作)。在写入S3时,所有数据都会复制到临时文件中,然后在S3上“重命名”-问题是重命名不会像在文件系统上那样发生,实际上会花费O(n)的时间。因此,我所有的数据都被复制到S3,然后所有的时间都花在了重命名文件上。

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

希望这可以帮助别人!

  • 那么你的解决方案是什么?使用 Steve 提到的 fileoutputcommiter 算法设置?或者使用 s3-dist-cp? (2认同)