[英]Sparklyr spark_apply function on equal groups to run efficiently
[英]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
sparklyr worker rscript failure, check worker logs for details
错误是由驱动程序节点写入的,并指出需要在工作程序日志中找到实际的错误。 通常,可以通过在Spark UI的“执行者”选项卡中打开stdout
来访问工作日志。 日志中应包含RScript:
描述执行程序正在处理的内容以及错误的具体内容的条目。
关于正在创建的单个任务,当未在spark_apply()
中用类型指定columns
时,它需要计算结果的子集来猜测列类型,为避免这种情况,请按如下所示传递显式列类型:
outtbl <- testtbl %>% spark_apply( myFunction, columns=list( string_id = "character", string_categories = "character"))
如果使用sparklyr 0.6.3
,则更新为sparklyr 0.6.4
或devtools::install_github("rstudio/sparklyr")
,因为在启用包分发且有多个执行程序的某些sparklyr 0.6.3
情况下, sparklyr 0.6.3
包含错误的等待时间。在每个节点中运行。
在高负载下,通常会耗尽内存。 增加分区数可以解决此问题,因为这会减少处理此数据集所需的总内存。 尝试运行为:
testtbl %>% sdf_repartition(1000) %>% spark_apply(myFunction, names=c('string_id', 'string_categories'))
也可能是由于函数中的逻辑而导致函数对某些分区抛出异常的情况,您可以使用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.