sparklyr spark_apply非常慢

时间:2019-04-25 11:36:16

标签: apache-spark sparklyr

sparklyr spark_apply非常慢/根本没有响应。签入spark UI时,正在执行的阶段在utils.scala:204处收集。它正在执行0/1(1个正在运行)任务。应用了spark_apply的数据帧具有30个分区。此任务没有进展,为什么执行单个任务

library(sparklyr)
library(dplyr)
config=spark_config()
config=c(config, list("spark.files"="hdfs:///bundle/packages.tar","spark.dynamicAllocation.enabled"="false","spark.executor.memory"="10g","spark.executor.cores"="4","spark.executor.instances"="7"))
sc <- spark_connect(master="yarn", app_name = "demo",config = config,version="2.3.0")
demo_data <- spark_read_csv(sc,name='demo_data',path = '/data.txt',delimiter = '\t',infer_schema = FALSE, columns = list(column1 = "integer"))
spark_apply(demo_data, function(df) df * 10, packages = "packages.tar" ,columns=list(column1="integer"))

1 个答案:

答案 0 :(得分:1)

在书《用R掌握火花》中 即使使用as a last resort,使用spark_apply following explainations进行的javier luraschi命令也表明,为克服瓶颈,特别是箭头库的开发,已经投入了大量资金。

也许在这一点上,他应该提到一些更合适的方法(请参阅Spark and Sparklyr)来使用sparklyr运行并行任务。

在github上,他解释说spark_apply遇到序列化问题,如herehere

所述。

另一方面,randomgambit认为,性能问题是由于Sparklyr行为复制了每个节点上的整个R分布。

就我而言,问题不在本地模式下出现, 但是在群集模式下首次执行spark_apply期间:

使用rstudio.com中的测试命令 基准测试可提供以下性能来运行该表达式

sdf_len(sc, 5, repartition = 1) %>% spark_apply(function(e) I(e)) 
  • 本地模式:

    Unit: seconds min lq mean median uq max neval 5.043947 5.043947 5.043947 5.043947 5.043947 5.043947 1

  • 集群模式(一位主管,一位工人):

    • 首次执行

    Unit: seconds min lq mean median uq max neval 928.0637 928.0637 928.0637 928.0637 928.0637 928.0637 1

    • 第二次执行

    Unit: seconds min lq mean median uq max neval 4.309775 4.309775 4.309775 4.309775 4.309775 4.309775 1

鉴于第二次执行要快得多,我相信Sparklyr在每个节点上复制整个R分布需要923秒= 15分钟23秒

以下是使用的代码:

library(dplyr) 
library(sparklyr) 
library(microbenchmark)
sc <- spark_connect(master = "local")

microbenchmark(
  sdf_len(sc, 5, repartition = 1) %>% spark_apply(function(e) I(e))
  ,times = 1L)    

conf <- spark_config()
conf[["spark.r.command"]] <- "d:/path_to/R-3.6.1/bin/Rscript.exe"
sc <- spark_connect(master="spark://192.168.0.12:7077", 
                                        version = "2.4.3",
                                        spark_home = "C:\\Users\\username\\AppData\\Local\\spark\\spark-2.4.3-bin-hadoop2.7",
                                        config = conf)
microbenchmark(
  sdf_len(sc, 5, repartition = 1) %>% spark_apply(function(e) I(e))
  ,times = 1L)
microbenchmark(
  sdf_len(sc, 5, repartition = 1) %>% spark_apply(function(e) I(e))
  ,times = 1L)