Sparklyr:当计算可用内存很少的新表时,如何避免在磁盘上溢出?

时间:2019-06-19 19:41:25

标签: r apache-spark sparklyr

当前,我正在本地模式下使用Sparklyr 1.0在6 GB数据集上运行,该虚拟机在具有26 GB内存和4个内核的虚拟机上运行,​​但最终目标是能够在集群上运行整个例程以处理100GB数据集。

我正在对数据集进行验证,从而创建了一系列中间表。

为了加快计算速度,我将其中一些表缓存在内存中,但由于内存有限,磁盘上有些溢出会大大减慢计算速度,因此我试图限制它。

最消耗内存的部分是当我从另一个需要缓存的6GB表中创建6GB表时,因为稍后我会对其进行大量计算。

代码如下:

table1 <- spark_read_csv(..., memory = T)

...
table2 <- Some calculations based on table1 
...

sdf_register(sc,table2)
tbl_uncache(sc,table1)
tbl_cache(sc,table2) 

我的配置:

conf <- spark_config()
conf["spark.serializer"] <- "org.apache.spark.serializer.KryoSerializer"
conf["sparklyr.shell.driver-memory"] <- "16G" 
conf["spark.sql.shuffle.partitions"] <- 12L
conf["spark.memory.fraction"] <- 0.90
conf["spark.memory.storagefraction"] <- 0.80
sc <- spark_connect(master = "local", config = conf)

溢出是在计算期间发生的,因为我猜执行是从存储中获取迫使溢出在磁盘上的内存,或者是在table2的缓存期间(我试图通过先取消缓存来避免这种情况)。

但是,看一下这段代码生成的作业,看来table2是为sdf_register和tbl_cache计算的,这对我来说似乎并不有效。

有更好的方法吗?

或者我可以简单地以不同的方式调整我的配置以避免溢出吗?

谢谢。

0 个答案:

没有答案