尽管每个任务的内存大于输入,但仍会引发Spark SparkOutOfMemoryError

时间:2019-09-29 06:34:51

标签: scala apache-spark

我正在使用10 r4.8xlarge,32个代码,244 GB内存和100GB SSD,我的输入是100个22GB txt文件。

下面是我的执行器参数

 --num-executors 59  --executor-cores 5 --executor-memory 37g

我将executor-cores设置为5,因为似乎人们建议将默认值设置为5,而num-executors是floor(32/5) * 10 - 1,executor-memory是(244 / floor(32/5)) (1 - 0.07),如本调优tutorial所建议

使用上面的配置,我得到

org.apache.spark.memory.SparkOutOfMemoryError: error while calling spill() on 
org.apache.spark.shuffle.sort.ShuffleExternalSorter@5eced6cb : No space left on device

与该代码相对应

    return spark.sparkContext
    .textFile(myInputDir)
    .repartition(15800) // experimentally tested to be a good partition base on 1 file, 1 file the best repartition is 3000

由于每个任务都获得了37GB的内存,并且超过了22GB,因此我对如何达到火花SparkOutOfMemoryError感到困惑,因为它只需读取并重新分区到其他节点即可。

有人可以给我指明方向吗?

2 个答案:

答案 0 :(得分:0)

除非您使用某些内存层(例如apache ignite),否则改组总是涉及磁盘写操作
您的错误明确指出No space left on device,请考虑增加磁盘容量。

答案 1 :(得分:0)

https://community.cloudera.com/t5/Support-Questions/spark-job-failure-with-no-space-left-on-device/td-p/197465

这可能是个问题.Spark将中间文件保留在/ tmp中,这可能会耗尽空间。您可以调整spark.local.dir或在提交时将此文件设置为具有更多空间的其他目录。在提交火花期间尝试添加相同的工作; --conf“ spark.local.dir = / directory / with / space”