我一直在努力找出我的spark工作有什么问题,它无限期地挂在我试图将其写入s3或hdfs(Parquet格式的约100g数据)的地方。
导致挂起的线:
spark_df.write.save(MY_PATH,format='parquet',mode='append')
我在overwrite和append模式下都尝试过这个方法,并尝试保存到hdfs和s3,但是不管发生什么,这个作业都会挂起。
在hadoop资源管理器gui中,它将spark应用程序的状态显示为“running”,但从外观上看,spark实际上没有执行任何操作,当我查看spark ui时,没有正在运行的作业。
让它工作的一件事是在集群处于挂起状态时增加集群的大小(我在aws上)。然而,如果我用6个worker开始集群并增加到7,或者如果我用7开始集群并增加到8,这对我来说有点奇怪,这并不重要。集群在这两种情况下都使用了所有可用的内存,但我没有收到内存错误。
有什么问题吗?
1条答案
按热度按时间kognpnkq1#
谢谢大家的帮助。最后我发现问题其实是几个独立的问题。我是这样理解他们的:
当我直接保存到s3时,它与steve loughran提到的问题有关,s3上的重命名速度非常慢(所以看起来我的集群什么也没做)。在写入s3时,所有数据都被复制到临时文件中,然后在s3上“重命名”——问题是重命名不像在文件系统上那样发生,实际上需要o(n)时间。所以我所有的数据都被复制到了s3,然后所有的时间都花在了重命名文件上。
我面临的另一个问题是将数据保存到hdfs,然后通过s3-dist-cp将其移动到s3。我的所有集群资源都被spark使用,因此当应用程序主机尝试提供资源以通过s3-dist-cp将数据移动到s3时,它无法执行。由于spark,数据的移动无法进行,spark也不会关闭,因为我的程序仍在尝试将数据复制到s3(因此它们被锁定)。
希望这能帮助别人!