5

即使是相当小的数据集,我也会遇到堆空间错误。我可以确定我没有用完系统内存。例如,考虑一个包含大约 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 的评论,我尝试降低MaxHeapSize4G. (是MaxHeapSize每个虚拟工作者还是整个 Spark 本地实例?)我仍然收到堆空间错误,而且我没有使用太多系统内存。

4

1 回答 1

4

在查看 Sandeep 的建议时,我开始深入研究sparklyr 部署说明。这些提到驱动程序在这个阶段可能会耗尽内存,并调整一些设置来纠正它。

这些设置并没有解决问题,至少一开始没有。但是,将问题隔离到阶段使我能够在 SO 上使用 SparkRcollect找到类似的 问题。

这些答案部分取决于设置环境变量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()
于 2016-12-29T20:29:32.230 回答