2016-12-29 91 views
1

即使是非常小的數據集,我也會遇到堆空間錯誤。我可以肯定,我沒有用完系統內存。例如,考慮一個包含大約20M行和9列的數據集,並在磁盤上佔用1GB。我在帶有30GB內存的Google Compute節點上玩遊戲。Sparklyr中堆空間不足,但擁有大量內存

假設我在一個名爲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的評論,我試圖降低MaxHeapSize4G。 (每個虛擬工作者或整個Spark本地實例是MaxHeapSize?)我仍然遇到堆空間錯誤,並且我沒有使用系統的大部分內存。

+2

減少'MaxHeapSize = 24G'到'MaxHeapSize = 4GB',因爲你只有一個GB的數據。它不需要24 GB的內存。即使是4GB就足夠了。 –

+0

謝謝;它仍然會得到錯誤。我澄清了這個問題的文字來解決這個問題。 –

+0

你也可以發佈你正在用來運行這項工作的火花提交命令? –

回答

2

在研究Sandeep的建議時,我開始深入研究sparklyrdeployment notes。這些提到司機可能在這個階段耗盡內存,並調整一些設置來糾正它。

這些設置沒有解決問題,至少在最初沒有解決。但是,將問題隔離到collect階段允許我在SO上使用SparkR找到similarproblems

這些答案將部分地取決於設置環境變量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()