即使试图抵消偏移量,也为GROUP TOPIC PARTITION记录了错误的记录

时间:2018-06-25 13:51:26

标签: apache-kafka spark-streaming

我正在使用Spark Streaming,当它尝试流式传输主题时突然收到此消息。如何跳过此错误?

Caused by: java.lang.AssertionError: assertion failed: Got wrong record for GROUP TOPIC 109 even after seeking to offset 754809
at scala.Predef$.assert(Predef.scala:170)
at org.apache.spark.streaming.kafka010.CachedKafkaConsumer.get(CachedKafkaConsumer.scala:90)
at org.apache.spark.streaming.kafka010.KafkaRDD$KafkaRDDIterator.next(KafkaRDD.scala:228)
at org.apache.spark.streaming.kafka010.KafkaRDD$KafkaRDDIterator.next(KafkaRDD.scala:194)
at scala.collection.Iterator$$anon$11.next(Iterator.scala:409)
at scala.collection.Iterator$$anon$11.next(Iterator.scala:409)
at scala.collection.Iterator$$anon$13.hasNext(Iterator.scala:462)
at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:408)
at scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:438)
at org.apache.spark.storage.memory.MemoryStore.putIteratorAsValues(MemoryStore.scala:222)
at org.apache.spark.storage.BlockManager$$anonfun$doPutIterator$1.apply(BlockManager.scala:988)
at org.apache.spark.storage.BlockManager$$anonfun$doPutIterator$1.apply(BlockManager.scala:979)
at org.apache.spark.storage.BlockManager.doPut(BlockManager.scala:919)
at org.apache.spark.storage.BlockManager.doPutIterator(BlockManager.scala:979)
at org.apache.spark.storage.BlockManager.getOrElseUpdate(BlockManager.scala:697)
at org.apache.spark.rdd.RDD.getOrCompute(RDD.scala:334)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:285)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
at org.apache.spark.scheduler.Task.run(Task.scala:99)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:322)

1 个答案:

答案 0 :(得分:0)

这不是实际答案,但不适合评论。另外,这不是解决方法。

Spark也保留偏移量,并在使用消息时检查完整性。 Spark Streaming API中保留的偏移状态与Kafka保留的偏移状态很少匹配。您可以检查偏移量的完整性:

kafka-simple-consumer-shell --broker-list BROKER:9092 --clientId GROUP_ID --offset 752000 --print-offsets --max-messages 1000 --topic TOPIC | grep offset

此处,偏移量为752000,但在失败之前,您会看到例外情况。

您可以遍历输出,并在Kafka中查看偏移量是否按顺序排列。

但是,在我们的案例中,Kafka中的偏移量很好。我们在卡夫卡(Kafka)发生了故障,因此不得不通过重建日志来恢复。因此,我们采取的方法只是将偏移量跳过到Spark Streaming与Kafka匹配的状态。

为此,我们使用kt工具作为

kt group -brokers BROKER:9092 -topic TOPIC -group GROUP_ID -partitions 113 -reset 753000

在这里,分区113是一个存在偏移量的问题(您可以从异常中找到它),而753000是一个可能的偏移量,您猜想以后应该没问题。有时,您需要重复该过程并重新开始工作,以使一切都好起来。

此过程是完全实验性的,因为该消息不会告诉您缺少哪个偏移量。因此,根据需要丢失多少数据的要求,可以选择日志中提到的偏移量之前或之后的数字。例如,如果在日志消息中打印了偏移752900,则可以通过将其设置为752800来跳过错误(错误的偏移在之前),或者必须将其设置为更早的值(例如752950)。在后者中,它会跳过50条消息。 / p>