如何中止火花转换

时间:2016-05-19 06:31:15

标签: scala apache-spark

我有一个包含项目ID的RDD。

我有一个转换,对于每个ID,转到数据库并获取完整的项目记录。

如果在数据库中找不到该项,则返回None

但是,有时我从DB获得超时异常。在这种情况下,我想中止flatMap而不是尝试访问每个项目的数据库(我假设如果我在一个项目上超时,我可能会在其余项目上获得相同的异常)。

我怎么能用火花来做这件事?

如果我从catch子句中调用return,我会收到错误" Spark闭包中不允许返回语句"

val rdd = sc.textFile(filePath, 1)
rdd.flatMap(id => {

    try {
            Some(getItemFromDB(id))
        } catch {
            case e: com.mongodb.MongoTimeoutException =>
                //Here I would like to abort the flatMap transformation and retry after waitine a period of time
            case t: Throwable => None
        }
}) 

我能做到的唯一优化是定义一个累加器= 0,它将保持从DB读取的状态。如果一个项目因超时而失败,则累加器增加1.在每次从DB读取之前,我们可以检查累加器的状态并尝试仅在accumulator = 0时读取。 但是,如果我没记错的话,火花累加器是"只写",所以这不会真的有效。

0 个答案:

没有答案