繁体   English   中英

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

[英]Sparklyr's spark_apply function seems to run on single executor and fails on moderately-large dataset

我正在尝试使用spark_apply在Spark表上运行以下R函数。 如果我的输入表很小(例如5,000行),这会很好地工作,但是在表中等大小(例如5,000,000行)的sparklyr worker rscript failure, check worker logs for details约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. sparklyr worker rscript failure, check worker logs for details错误是由驱动程序节点写入的,并指出需要在工作程序日志中找到实际的错误。 通常,可以通过在Spark UI的“执行者”选项卡中打开stdout来访问工作日志。 日志中应包含RScript:描述执行程序正在处理的内容以及错误的具体内容的条目。

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

    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情况下, 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")) ) }) }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM