我使用来自http://spark.apache.org/docs/latest/streaming-kafka-integration.html的方法2,我使用检查指向,当我不得不更改代码并重新部署我的代码时,有时检查点会抛出异常,如果由于某种原因,我不得不删除检查点目录,如何重用检查点目录文件夹来从kafka获取消息,我认为检查点目录中存储了kafka偏移量。
答案 0 :(得分:0)
是的,我已经看到了。使用检查点时,重新编译的代码有时会抛出异常(非常奇怪)。
平心而论,检查点的重点是,如果存在与数据相关的问题,您应该能够从中恢复。
是:当您为KafkaDstream检查点时,您的偏移量会被存储。 所以,当你恢复时,你从最后一个地方开始。
如果您想对Kafka偏移量进行更细粒度的控制,请查看cody's example。他是编写Direct KafkaDstream的人。
答案 1 :(得分:0)
如何重用检查点目录文件夹来获取消息 kafka,我认为检查点目录中存储了kafka偏移量
如果您更改了代码,则不能。 Spark Streaming checkpointing不仅会保留底层RDD,还会保留元数据,例如在该时间点运行的spark图,因此它可以在崩溃后恢复时重建谱系,例如。
这意味着如果您确实更改了代码,则必须在恢复流式传输作业之前删除任何检查点数据。这也意味着存储在检查点目录中的kafka偏移对您没用。这就是为什么如果您使用Spark 1.3中引入的无接收流方法,建议手动保留偏移量。
From the documentation(强调我的):
请注意,此方法的一个缺点是它不会更新 Zookeeper中的偏移量,因此基于Zookeeper的Kafka监控工具 不会显示进度。 但是,您可以访问已处理的偏移量 通过这种方法在每个批次中自己更新Zookeeper(参见 下文)强>
甚至还有一段代码可以帮助您入门:
// Hold a reference to the current offset ranges, so it can be used downstream
var offsetRanges = Array[OffsetRange]()
directKafkaStream.transform { rdd =>
offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
rdd
}.map { // Do stuff
}.foreachRDD { rdd =>
for (o <- offsetRanges) {
println(s"${o.topic} ${o.partition} ${o.fromOffset} ${o.untilOffset}")
}
}