0

我有 5 种模式,每种模式都有 8 个 cpu 内核和 30GB 内存。我有 5GB 的 dataset1 和 65GB 的 dataset2,所以我需要加入它们并保存到 s3 文件系统,我设置了以下参数:

--num-executors 4 --spark.driver.memory 8g --executor-cores 5 --executor-memory 27g  --conf spark.yarn.executor.memoryOverhead=824m

但是,我到处搜索并尝试了不同的参数,但仍然出现内存不足错误。超出 Gc 开销限制。

在 Java 代码中也使用了这个:

conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer");
conf.set("spark.kryo.registrator", AvgRegistrator.class.getName());
conf.set("spark.driver.maxResultSize", "5g");
conf.set("spark.broadcast.compress", "true");
conf.set("spark.shuffle.compress", "true"); 

stackoverflow 中没有任何解决方案对我有用。所以任何人都可以给我一个更好的解决方案来摆脱这个问题。

Spark java.lang.OutOfMemoryError: Java heap space

有一段时间我得到这个:

java.lang.OutOfMemoryError: GC overhead limit exceeded
4

1 回答 1

1

我会尝试提高并行度(即将分区分成更小的分区)。

如果您在底层存储中只有几个分区,那么您必须在加入之前手动重新分区数据(例如,通过调用repartition()您的数据集或 RDD)。此外,spark.default.parallelism如果您使用的是 RDD,设置属性会有所帮助。如果您使用的是数据集,请考虑该spark.sql.shuffle.partitions参数,该参数定义每次 shuffle 操作后的分区数。

于 2016-11-30T16:40:41.347 回答