Apache spark 了解火花流故障保证

Apache spark 了解火花流故障保证,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我试图了解当Spark在处理过程中出现异常时会发生什么,特别是在流媒体时 如果我有一个像这样的小代码spinet: [info] processed => [List(Item1)] [error] 28-01-2016 17:41:18 ERROR JobScheduler:96 - Error running job streaming job 1453999278000 ms.0 [error] java.lang.Exception: User exception... ... [

我试图了解当Spark在处理过程中出现异常时会发生什么,特别是在流媒体时

如果我有一个像这样的小代码spinet:

[info] processed => [List(Item1)]
[error] 28-01-2016 17:41:18 ERROR JobScheduler:96 - Error running job streaming job 1453999278000 ms.0
[error] java.lang.Exception: User exception...
...
[info] processed => [List(Item2)]
[error] 28-01-2016 17:41:19 ERROR JobScheduler:96 - Error running job streaming job 1453999279000 ms.0
[error] java.lang.Exception: User exception...
myDStream.foreachRDD{(rdd:rdd[String])=>
println(s“processed=>[${rdd.collect().toList}]”)
抛出新异常(“用户异常…”)
}
如果我运行此命令,我将得到如下输出:

[info] processed => [List(Item1)]
[error] 28-01-2016 17:41:18 ERROR JobScheduler:96 - Error running job streaming job 1453999278000 ms.0
[error] java.lang.Exception: User exception...
...
[info] processed => [List(Item2)]
[error] 28-01-2016 17:41:19 ERROR JobScheduler:96 - Error running job streaming job 1453999279000 ms.0
[error] java.lang.Exception: User exception...
第一个“Item1”被处理,它失败了(当然)。在下一批中,处理“Item2”。记录“Item1”现在已丢失

如果我更改代码使异常发生在任务中:

myDStream.foreachRDD{(rdd:rdd[String])=>
println(s“processed=>[${rdd.collect().toList}]”)
map{case x=>抛出新异常(“用户异常…”)}.collect()
}
然后将重试map闭包,但一旦它失败足够多的次数,记录将被丢弃,处理将继续到下一条记录

即使这意味着停止应用程序,是否可以确保不会丢弃记录?我已经启用了WAL


更新:如来达斯在Spark用户邮件列表上做出响应。

假设您已将
Spark.streaming.receiver.writeAheadLog.enable
配置为
true
,也建议在Spark作业中创建流时使用
内存和磁盘服务器2
作为
存储级别
,这将确保在进一步处理数据之前对其进行复制

我假设您还需要在流媒体作业中使用
一次
语义,为此,您还需要检查并确保您的接收器是可靠的

还建议参考部分以执行事务更新


最后,我们还建议部署一些监视工具,用于监视/检查执行器日志中是否存在任何异常,以及在遇到异常时终止作业或采取适当措施。

感谢您的回复。请查看我的更新和与T.Das的邮件链。也许我可以举个更好的例子。我不认为StorageLevel会有帮助,Spark认为该记录已被处理,将从WAL和存储中删除。至少一次就可以了,不需要一次。我不是在用卡夫卡。我使用的是JMS,不可能从源代码重播。监控是好的,但当警报关闭时,数据将已经丢失。