r - 如何提高 sparklyr 读取 csv 的性能?
问题描述
我认为使用 .csv 文件读取速度非常慢sparklyr
。见 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 以使其更快?
解决方案
这里至少存在三个问题:
local
模式不是分布式的,甚至不是并行的。它只会使用一个本地线程。如果您只有一个节点可供使用,至少尝试增加可用线程的数量(可能超过可用内核的数量)。一般来说,单个 JVM 路径不是最好的方法,尤其是在内存较大的情况下。即使您没有多个节点可供使用,您也可以将伪分布式与独立集群和并置的主节点和工作节点一起使用。
您不为读者提供架构,并且需要架构推断(
infer_schema
参数的默认值)。如果你想避免这种开销,你应该提供一个 schema。- 您急切地缓存数据(
memory
参数的默认值),这既昂贵又很少有用。
此外:
- 如此高的价值
spark.memory.fraction
很可能会驱使垃圾收集器疯狂填充老一代。一定要检查 GC 次数,如果异常高,减少spark.memory.fraction
到默认值(0.6)以下,而不是增加。
最后:
- 降低你的期望。与经过优化的核心原生库相比, Spark会非常慢。
推荐阅读
- javascript - 使用 Google Tag Manager 将 React 应用程序嵌入另一个网站
- node.js - Nodejs等待图像将被下载
- ruby - 如何使用另一个 gem 作为依赖项并创建一个继承自它的类
- html - vue - 在链接中设置字符集属性到构建的 css
- python - 如何计算熊猫数据框中空值的百分比?
- python - 如何使用 Telethon 通过电话号码获取实体?
- javascript - 在 React JS 中使用播放和停止按钮控制 material-ui 滑块
- javascript - 通过在 react-select 中单击添加组标题以进行搜索
- javascript - 使用 ng-click 时 ng-if 在 angularjs 上的行为
- arrays - 在c中的数组中添加带有循环的元素的问题