当前,我正在本地模式下使用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计算的,这对我来说似乎并不有效。
有更好的方法吗?
或者我可以简单地以不同的方式调整我的配置以避免溢出吗?
谢谢。