Der*_*k_M 5 hadoop jvm scala elastic-map-reduce apache-spark
我想任何使用过 Spark 的人都遇到过 OOM 错误,而且通常很容易找到问题的根源。不过,我对这个问题有点困惑。目前,我正在尝试使用该功能通过两个不同的分区进行保存partitionBy。它看起来像下面这样(虚构的名字):
df.write.partitionBy("account", "markers")
.mode(SaveMode.Overwrite)
.parquet(s"$location$org/$corrId/")
Run Code Online (Sandbox Code Playgroud)
这个特定的数据框包含大约 30GB 的数据、2000 个帐户和 30 个标记。账户和标记的分布接近均匀。我尝试使用亚马逊 r4.8xlarge 的 5 个核心节点和 1 个主节点驱动程序(220+ GB 内存),并使用默认的最大化资源分配设置(其中 2 个核心用于执行程序,大约 165 GB 内存)。我还明确将核心数、执行器数设置为不同的数字,但遇到了相同的问题。当查看 Ganglia 时,我没有看到任何过多的内存消耗。
因此,根本原因很可能是随机播放时可能发生的 2gb ByteArrayBuffer 问题。然后,我尝试使用各种数字(例如 100、500、1000、3000、5000 和 10000)重新分区数据帧,但没有成功。该作业偶尔会记录堆空间错误,但大多数情况下都会给出节点丢失错误。当查看各个节点日志时,它似乎突然失败,没有任何问题迹象(对于某些 oom 异常,这并不奇怪)。
对于数据帧写入,partitionBy 是否有技巧可以传递内存堆空间错误?