我们目前正在开发一个使用kafka,spark streaming和Cassandra作为DB的系统 . 我们正在使用基于此处内容的检查点[http://spark.apache.org/docs/latest/streaming-programming-guide.html#checkpointing] . 在用于创建Streaming上下文的函数内部,我们使用createDirectStream来创建DStream,从这一点开始,我们在不同的RDD上执行从调用saveToCassandra派生的几个转换和动作

我们正在运行不同的测试来确定应用程序在发生故障时应该如何恢复 . 关于我们场景的一些关键点是:

  • 我们正在测试kafka中的固定数量的记录(1000万到2000万之间),这意味着,我们从kafka消费一次,应用程序带来了kafka的所有记录 .

  • 我们正在其中一个worker中的--deploy-mode'client'中执行应用程序,这意味着我们手动停止并启动驱动程序 .

我们不确定如何在创建DStream之后处理异常,例如,如果写入cassandra时所有节点都已死,我们会得到一个中止作业的异常,但在重新提交应用程序后,该作业不会被重新安排并且应用程序不断消耗kafka获取多个'isEmpty'调用 .

我们在重新分区的RDD上使用“缓存”进行了几次测试(在失败不仅仅是停止和启动驱动程序之后不起作用),并更改参数“query.retry.count”,“query.retry” . 延迟“和”spark.task.maxFailures“没有成功,例如,作业在x次失败后中止 .

在这一点上,我们对如何在失败后使用检查点重新安排作业感到困惑 .