我们目前正在开发一个使用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的所有记录。
我们正在--deploy-mode' client'中执行应用程序在其中一个工人中,这意味着我们手动停止并启动驱动程序。
我们不确定如何在创建DStream之后处理异常,例如,如果在写入cassandra时所有节点都已死,我们会得到一个异常中止作业,但在重新提交应用程序后,该作业不是重新安排和应用程序继续消费kafka得到多个'isEmpty'调用。
我们使用'缓存'进行了几项测试。在重新分区的RDD上(在失败不仅仅是停止和启动驱动程序之后它没有工作),并且更改参数" query.retry.count"," query.retry。延迟"和" spark.task.maxFailures"没有成功,例如,在x次失败后作业被中止。
此时我们对如何在失败后使用检查点重新安排作业感到困惑。