即使是相当小的数据集,我也会遇到堆空间错误。我可以确定我的系统内存不足。例如,考虑一个包含大约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()
我尝试this suggestion来增加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本地实例?)我仍然遇到堆空间错误,而且我没有使用系统的大部分内存。
答案 0 :(得分:4)
在研究Sandeep的建议时,我开始深入研究sparklyr
deployment notes。这些提到驱动程序可能在此阶段耗尽内存,并调整一些设置以纠正它。
这些设置并没有解决问题,至少最初没有。但是,将问题隔离到collect
阶段,我可以在SO上使用SparkR找到similar problems。
这些答案部分取决于设置环境变量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()