我认为使用sparklyr
读取CSV文件的速度非常慢。见MVE
library(sparklyr)
library(dplyr)
conf <- spark_config()
conf$spark.executor.memory <- "60GB"
conf$spark.memory.fraction <- 0.9
conf$spark.executor.cores <- 6
conf$spark.dynamicAllocation.enabled <- "false"
sc <- sparklyr::spark_connect(master = "local", config = conf)
library(data.table)
fwrite(data.table(
id1 = sample(sprintf("id%03d",1:K), N, TRUE), # large groups (char)
id2 = sample(sprintf("id%03d",1:K), N, TRUE), # large groups (char)
id3 = sample(sprintf("id%010d",1:(N/K)), N, TRUE), # small groups (char)
id4 = sample(K, N, TRUE), # large groups (int)
id5 = sample(K, N, TRUE), # large groups (int)
id6 = sample(N/K, N, TRUE), # small groups (int)
v1 = sample(5, N, TRUE), # int in range [1,5]
v2 = sample(5, N, TRUE), # int in range [1,5]
v3 = sample(round(runif(100,max=100),4), N, TRUE) # numeric e.g. 23.5749
), "a.csv")
system.time(sparklyr::spark_read_csv(sc, "a", "a.csv"))
我已经尝试增加Spark可用的RAM级别,但是读取速度太慢,只有500秒!与data.table::fread
相比,这太慢了。
总有没有配置Spark以便更快?
答案 0 :(得分:1)
这里至少存在三个问题:
local
模式不是分布式的,甚至不是并行的。它只会使用一个本地线程。如果只有一个节点可供使用,则至少尝试增加可用线程的数量(可能超出可用核心的数量)。
通常,单个JVM路径不是最好的方法,尤其是在内存较大的情况下。即使您没有多个节点可供使用,您也可以对独立群集以及主服务器和工作器并置使用伪分布式。
您没有为阅读器提供架构,而是需要架构推断(infer_schema
参数的默认值)。如果您想避免这种开销,则应该provide a schema。
memory
参数的默认值),该数据既expensive又很少有用。另外:
spark.memory.fraction
的如此高的值很可能会使垃圾回收器疯狂地填充旧一代。请务必检查GC时间,如果异常高,请将spark.memory.fraction
降低到默认值(0.6)以下,不要增加。最后: