Scala Spark 2.2写入分区内存不足异常

Scala Spark 2.2写入分区内存不足异常,scala,hadoop,apache-spark,jvm,elastic-map-reduce,Scala,Hadoop,Apache Spark,Jvm,Elastic Map Reduce,我认为任何使用过Spark的人都会遇到OOM错误,通常可以很容易地找到问题的根源。然而,我对这一点有点困惑。目前,我正在尝试使用partitionBy函数按两个不同的分区进行保存。它看起来像下面这样(化名): 这个特定的数据帧有大约30gb的数据、2000个帐户和30个标记。帐户和标记几乎均匀分布。我曾尝试使用亚马逊r4.8XL(220+gb内存)的5个核心节点和1个主节点驱动程序,并使用默认的最大化资源分配设置(执行器使用2个核心,内存约为165gb)。我还明确地将核心数、执行器数设置为不同的

我认为任何使用过Spark的人都会遇到OOM错误,通常可以很容易地找到问题的根源。然而,我对这一点有点困惑。目前,我正在尝试使用
partitionBy
函数按两个不同的分区进行保存。它看起来像下面这样(化名):

这个特定的数据帧有大约30gb的数据、2000个帐户和30个标记。帐户和标记几乎均匀分布。我曾尝试使用亚马逊r4.8XL(220+gb内存)的5个核心节点和1个主节点驱动程序,并使用默认的最大化资源分配设置(执行器使用2个核心,内存约为165gb)。我还明确地将核心数、执行器数设置为不同的数,但存在相同的问题。当观察神经节时,我没有看到任何过度的内存消耗

因此,根本原因似乎很可能是洗牌时可能发生的2gb ByteArrayBuffer问题。然后我尝试用不同的数字重新划分数据帧,比如100、500、1000、3000、5000和10000,但没有成功。作业偶尔会记录堆空间错误,但大多数情况下会出现节点丢失错误。当查看单个节点日志时,它似乎突然失败,没有问题的迹象(这对于某些oom异常并不奇怪)


对于数据帧写入,partitionBy有没有一个技巧来传递内存堆空间错误?

您是否尝试过
df.repartition($“account”,$“markers”).write.partitionBy($“account”,“markers”)…
啊,这很好,但很奇怪@拉斐尔·罗斯是的,实际上我先尝试过重新分区,但遇到了同样的问题。我甚至试过改变顺序。我可能会用spark创建一张罚单,因为我已经记录了我的一长串试验。我看到了完全相同的问题。如果你有更多的发现,请更新线程。@botchniaque如果我找到了,我会的。这似乎很奇怪。我用一个小得多的数据集发布了这篇文章,它很快就被关闭了。我们注意到,将
warn.executor.memoryOverhead
设置为高于默认值的值(在您的情况下,您可以尝试3G)对于意外的OOM错误有很大帮助。对于
纱线.executor.memoryOverhead
而言,默认值为
executor.memory
的7%,但不小于384M,因此对于16G
executor.memory
而言,使用的值约为1.1G
df.write.partitionBy("account", "markers")
  .mode(SaveMode.Overwrite)
  .parquet(s"$location$org/$corrId/")