为什么Spark会在发生异常时杀死驱动程序进程?

时间:2015-10-29 13:42:44

标签: apache-spark spark-streaming

我是Spark Streaming和Spark的新用户。在我的测试中,我注意到流中的单个错误使整个流应用程序失败。

为了更清楚,让我用一个例子来解释。假设提交的应用程序使用类似15, 10, 21, 12, ...的整数流。但是,该流可能错误地携带一些非整数字符串(例如15, 10, 21, 12, foo, 32, ...)。如果我的代码有错误并假设所有数据项都是整数,那么它会在流中处理foo字符串时抛出异常。

在这种情况下,Spark引擎默认重试任务3次(您可以检查config documentation spark.task.maxFailures参数)。然后,在所有不成功的尝试之后,它中止驱动程序进程并因此中止执行程序。

我不确定这是正确的行为。相反,我认为当前任务(即部分数据的执行)或批处理(即从流中读取的数据项束)将被丢弃。因此,驱动程序将处理剩余的流。

任何想法为什么Spark表现得那样?是否有任何配置强制引擎忽略故障并继续前进?

顺便说一下,我在独立模式下使用Spark。 YARN或Mesos可以为此提供帮助吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

如果Spark无声地失败了,你怎么知道出了什么问题? (YARN或Mesos对此没有帮助。)

与Reactormonk建议的一样,您应该指定如何将失败作为您传递给Spark的函数的一部分来处理。如果您只是想丢弃错误的行而您正在使用Scala,则可能需要执行以下操作:

val strRDD = sc.parallelize(Array("15", "10", "21", "12", "foo", "32"),1)
val intRDD = strRDD.flatMap(x => try{Some(x.toInt)} catch {case e: Exception => None})
intRDD.collect()

这将返回Array[Int] = Array(15, 10, 21, 12, 32)

相关问题