spark分区因内存不足而失败

时间:2018-06-27 20:04:53

标签: apache-spark pyspark apache-spark-sql

我有一个用pyspark编写的Spark 2.2作业,试图在蜂巢表中读取300BT的Parquet数据,通过python udf运行它,然后将其写出。

输入被划分为大约五个键,并导致大约25万个分区。

然后我想使用相同的分区方案将其写出,并为数据框使用.partitionBy子句。

当我不使用partitionBy子句时,数据将写出,并且作业最终会完成。但是,通过partitionBy子句,我不断在spark UI上看到内存不足的故障。

进一步调查后,磁盘上的源实木复合地板数据约为800MB(使用snappy压缩),并且每个节点都有大约50G的可用内存。

检查spark UI,我发现写出之前的最后一步是进行排序。我相信这是我所有问题的原因。

在读取已分区数据的数据帧时,是否有任何方法可以保留有关此分区的知识,因此spark在写出来之前不会运行不必要的排序?

我正在尝试通过重新分区来避免改组,这可能同样导致进一步的延迟。

最终我可以重写一次读取一个分区,但是我认为这不是一个好的解决方案,并且spark应该已经能够处理此用例。

我在ec2 r3.8xlarge上的150个节点上运行着约1500个执行器。

我尝试了较小的执行程序配置和较大的执行程序配置,并且总是遇到相同的内存不足问题。

0 个答案:

没有答案