运行 在 sparklyr 中堆 space 不足,但有足够的内存
Running out of heap space in sparklyr, but have plenty of memory
即使是相当小的数据集,我也会遇到堆 space 错误。我可以确定我没有 运行 系统内存不足。例如,假设一个数据集包含大约 2000 万行和 9 列,并且占用 1GB 磁盘空间。我在具有 30gb 内存的 Google 计算节点上玩它。
假设我在名为 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 将堆 space 增加到 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 本地实例?)我仍然遇到堆 space 错误,而且我没有使用太多系统内存。
在研究 Sandeep 的建议时,我开始深入研究 sparklyr
deployment notes。这些提到驱动程序在此阶段可能 运行 内存不足,并调整一些设置来纠正它。
这些设置并没有解决问题,至少最初没有。但是,将问题隔离到 collect
阶段使我能够在 SO 上使用 SparkR 找到 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()
即使是相当小的数据集,我也会遇到堆 space 错误。我可以确定我没有 运行 系统内存不足。例如,假设一个数据集包含大约 2000 万行和 9 列,并且占用 1GB 磁盘空间。我在具有 30gb 内存的 Google 计算节点上玩它。
假设我在名为 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 将堆 space 增加到 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 本地实例?)我仍然遇到堆 space 错误,而且我没有使用太多系统内存。
在研究 Sandeep 的建议时,我开始深入研究 sparklyr
deployment notes。这些提到驱动程序在此阶段可能 运行 内存不足,并调整一些设置来纠正它。
这些设置并没有解决问题,至少最初没有。但是,将问题隔离到 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()