Sparklyr的spark_apply函数似乎在单个执行程序上运行,在中等大小的数据集上失败

时间:2017-09-25 02:21:03

标签: r apache-spark sparklyr

我正在尝试使用spark_apply在Spark表上运行下面的R函数。如果我的输入表很小(例如5,000行),这可以正常工作,但是当表格适度大(例如5,000,000行)时,约30分钟后会抛出错误: sparklyr worker rscript failure, check worker logs for details

查看Spark UI显示,只创建了一个任务,并且将一个执行程序应用于此任务。

任何人都可以就500万行数据集失败的原因提出建议吗?问题可能是单个执行者正在做所有的工作而失败了吗?

# Create data and copy to Spark
testdf <- data.frame(string_id=rep(letters[1:5], times=1000), # 5000 row table
                 string_categories=rep(c("", "1", "2 3", "4 5 6", "7"), times=1000))
testtbl <- sdf_copy_to(sc, testdf, overwrite=TRUE, repartition=100L, memory=TRUE)

# Write function to return dataframe with strings split out
myFunction <- function(inputdf){
  inputdf$string_categories <- as.character(inputdf$string_categories)
  inputdf$string_categories=with(inputdf, ifelse(string_categories=="", "blank", string_categories))
  stringCategoriesList <- strsplit(inputdf$string_categories, ' ')
  outDF <- data.frame(string_id=rep(inputdf$string_id, times=unlist(lapply(stringCategoriesList, length))),
                  string_categories=unlist(stringCategoriesList))
 return(outDF)
}

# Use spark_apply to run function in Spark
outtbl <- testtbl %>%
  spark_apply(myFunction,
          names=c('string_id', 'string_categories'))
outtbl

1 个答案:

答案 0 :(得分:5)

  1. 驱动程序节点写入sparklyr worker rscript failure, check worker logs for details错误,并指出需要在工作日志中找到实际错误。通常,可以通过从Spark UI中的执行程序选项卡中打开stdout来访问工作日志;日志应包含RScript:个条目,描述执行程序正在处理的内容以及错误的具体内容。

  2. 关于正在创建的单个任务,如果未在columns中使用类型指定spark_apply(),则需要计算结果的子集以猜测列类型,以避免这种情况,传递显式列类型如下:

    outtbl <- testtbl %>% spark_apply( myFunction, columns=list( string_id = "character", string_categories = "character"))

  3. 如果使用sparklyr 0.6.3,请更新为sparklyr 0.6.4devtools::install_github("rstudio/sparklyr"),因为sparklyr 0.6.3在启用了包分发的某些边缘情况下包含不正确的等待时间等等每个节点都运行一个执行程序。

  4. 在高负载下,内存不足是常见的。增加分区数可以解决此问题,因为它会减少处理此数据集所需的总内存。尝试将其作为:

    运行

    testtbl %>% sdf_repartition(1000) %>% spark_apply(myFunction, names=c('string_id', 'string_categories'))

  5. 也可能是由于函数中的逻辑,函数会抛出某些分区的异常,你可以通过使用tryCatch()忽略错误来查看是否是这种情况。然后找出哪些是缺失值以及为什么函数会因这些值而失败。我会从以下内容开始:

    myFunction <- function(inputdf){ tryCatch({ inputdf$string_categories <- as.character(inputdf$string_categories) inputdf$string_categories=with(inputdf, ifelse(string_categories=="", "blank", string_categories)) stringCategoriesList <- strsplit(inputdf$string_categories, ' ') outDF <- data.frame(string_id=rep(inputdf$string_id, times=unlist(lapply(stringCategoriesList, length))), string_categories=unlist(stringCategoriesList)) return(outDF) }, error = function(e) { return( data.frame(string_id = c(0), string_categories = c("error")) ) }) }