运行 在 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()