即使在相当小的数据集上,我也会遇到堆空间错误。我可以确定我没有耗尽系统内存。例如,考虑一个包含大约 20M 行和 9 列的数据集,占用磁盘上的 1GB 空间。我正在具有 30GB 内存的 Google Compute 节点上玩它。
假设我将此数据存储在名为
df
的数据框中。以下工作正常,尽管有点慢:
library(tidyverse)
uniques <- search_raw_lt %>%
group_by(my_key) %>%
summarise() %>%
ungroup()
以下抛出
java.lang.OutOfMemoryError: Java heap space
。
library(tidyverse)
library(sparklyr)
sc <- spark_connect(master = "local")
df_tbl <- copy_to(sc, df)
unique_spark <- df_tbl %>%
group_by(my_key) %>%
summarise() %>%
ungroup() %>%
collect()
我尝试了这个建议来增加 Spark 的堆空间。问题仍然存在。在
htop
上观察机器的状态,我发现总内存使用量从未超过 10GB 左右。
library(tidyverse)
library(sparklyr)
config <- spark_config()
config[["sparklyr.shell.conf"]] <- "spark.driver.extraJavaOptions=-XX:MaxHeapSize=24G"
sc <- spark_connect(master = "local")
df_tbl <- copy_to(sc, df)
unique_spark <- df_tbl %>%
group_by(my_key) %>%
summarise() %>%
ungroup() %>%
collect()
最后,根据 Sandeep 的评论,我尝试将
MaxHeapSize
降低到 4G
。 (MaxHeapSize
是针对每个虚拟工作者还是针对整个 Spark 本地实例?)我仍然遇到堆空间错误,并且我再次没有使用太多系统内存。
在研究 Sandeep 的建议时,我开始深入研究
sparklyr
部署说明。这些提到驱动程序在此阶段可能会耗尽内存,并需要调整一些设置来纠正它。
这些设置并没有解决问题,至少最初没有。然而,将问题隔离到
collect
阶段让我能够在SO上使用SparkR找到类似问题。
这些答案部分取决于环境变量的设置
SPARK_MEM
。把它们放在一起,我让它工作如下:
library(tidyverse)
library(sparklyr)
# Set memory allocation for whole local Spark instance
Sys.setenv("SPARK_MEM" = "13g")
# Set driver and executor memory allocations
config <- spark_config()
config$spark.driver.memory <- "4G"
config$spark.executor.memory <- "1G"
# Connect to Spark instance
sc <- spark_connect(master = "local")
# Load data into Spark
df_tbl <- copy_to(sc, df)
# Summarise data
uniques <- df_tbl %>%
group_by(my_key) %>%
summarise() %>%
ungroup() %>%
collect()
我在 java heap oom 上遇到了类似的问题,这对我有用:
config <- spark_config()
config$`sparklyr.shell.driver-memory` <- '16G'
config$`sparklyr.shell.executor-memory` <- '16G'
config$`sparklyr.verbose` <- TRUE
sc <- spark_connect(master = "local", log = "console", config = config)