为什么在r到sparkyr中使用spark这么慢?

5cnsuln7  于 2021-05-18  发布在  Spark
关注(0)|答案(0)|浏览(434)

我在sparkyr包中使用了spark,但是速度非常慢。不过,我对spark还完全陌生,所以也许我用错了,也许我的期望值错了。我运行哪个命令并不重要,似乎所有的操作都比用普通的r执行慢得多。
版本:R3.6.3、dplyr\ U 1.0.2、SPARKYR\ U 1.4.0、spark 3.0.0
使用pull()检索数据就是一个例子

library(sparklyr)
library(dplyr)

sc <- spark_connect(master = "local")  

iris_x_5 <- as.data.frame(Reduce(cbind, rep(iris, 5)))

sp_iris_x_5 <- copy_to(sc, iris_x_5, overwrite = TRUE)

repeats <- 100

rbenchmark::benchmark(
  "plain R" = {
    iris_x_5 %>% pull(1)
  },
  "spark" = {
    sp_iris_x_5 %>% pull(1)
  }, 
  replications = repeats)

结果:

test replications elapsed relative user.self sys.self user.child sys.child
1 plain R          100   0.160    1.000     0.056    0.027      0.004     0.047
2   spark          100  34.207  213.794     7.133    5.215      0.324     5.972

这只是spark和r之间交换数据的开销吗?我的意思是,我们在这里讨论的是一个有150个数值的向量,100次重复怎么需要34秒?。
有了spark,情况变得更糟了。这段代码所做的唯一一件事就是创建一个row id列(可能在没有spark\u apply的情况下是可行的,但这并没有改变这一点)。

repeats <- 10

rbenchmark::benchmark(
  "plain R" = {
    iris_x_5 %>% mutate(row_id = 1:nrow(iris_x_5))
  },
  "spark" = {
    spark_apply(sp_iris_x_5, function(data) {
      data$row_id = 1:nrow(data)
      return(data)
    })
  }, 
  replications = repeats)

结果:

test replications elapsed relative user.self sys.self user.child sys.child
1 plain R           10   0.026    1.000     0.025        0       0.00      0.00
2   spark           10  31.206 1200.231     4.492        2       0.08      2.02

此外,当数据集变得越来越大时,复制到的时间也会越来越长。我试图加载一个包含30万行和400列的Dataframe,大约一个小时后就放弃了。
可能与此相关的是,每当我在新的r会话中使用sparklyr和dplyr时,都会收到关于不推荐使用的函数的警告。e、 g.首次执行

sp_iris_x_5 %>% pull(1)

给了我

1: `overscope_eval_next()` is deprecated as of rlang 0.2.0.
Please use `eval_tidy()` with a data mask instead.
This warning is displayed once per session. 
2: `overscope_clean()` is deprecated as of rlang 0.2.0.

但是如上所述,所有的东西都是最新的,所以我真的不知道该怎么处理这些信息。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题