spark kafka集成检查点重用

时间:2016-03-30 23:08:17

标签: apache-spark apache-kafka spark-streaming

我使用来自http://spark.apache.org/docs/latest/streaming-kafka-integration.html的方法2,我使用检查指向,当我不得不更改代码并重新部署我的代码时,有时检查点会抛出异常,如果由于某种原因,我不得不删除检查点目录,如何重用检查点目录文件夹来从kafka获取消息,我认为检查点目录中存储了kafka偏移量。

2 个答案:

答案 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}")
   }
}