在sparklyr中耗尽堆空间,但有足够的内存

时间:2016-12-29 17:18:43

标签: r apache-spark dplyr sparklyr

即使是相当小的数据集,我也会遇到堆空间错误。我可以确定我的系统内存不足。例如,考虑一个包含大约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本地实例?)我仍然遇到堆空间错误,而且我没有使用系统的大部分内存。

1 个答案:

答案 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()
相关问题