Apache spark Spark:在批处理结束时提交kafka偏移量
版本:Apache spark Spark:在批处理结束时提交kafka偏移量,apache-spark,apache-kafka,Apache Spark,Apache Kafka,版本: 火花2.2 卡夫卡0.11 根据卡夫卡中的提交偏移量,我应该使用: stream.asInstanceOf[cancommitoffset].commitAsync(offsetRanges) 因此,偏移量仅在下一批开始时提交。这会导致“持续”滞后 在当前批处理结束时提交偏移量是否有任何解决方法(但仍然使用相同的kafka组进行偏移量) 滞后监测示例: 在当前批处理结束时是否有提交偏移量的解决方法 不是通过commitAsyncAPI。方法调用所做的是将要提交的偏移量排队,然后在D
- 火花2.2
- 卡夫卡0.11
stream.asInstanceOf[cancommitoffset].commitAsync(offsetRanges)
因此,偏移量仅在下一批开始时提交。这会导致“持续”滞后
在当前批处理结束时提交偏移量是否有任何解决方法(但仍然使用相同的kafka组进行偏移量)
滞后监测示例:
在当前批处理结束时是否有提交偏移量的解决方法
不是通过commitAsync
API。方法调用所做的是将要提交的偏移量排队,然后在DirectKafkaInputDStream.compute期间执行异步提交:
override def compute(validTime: Time): Option[KafkaRDD[K, V]] = {
val untilOffsets = clamp(latestOffsets())
// Create KafkaRDD and other irrelevant code
currentOffsets = untilOffsets
commitAll()
Some(rdd)
}
其中commitAll
仅轮询由commitAsync
填充的队列:
protected def commitAll(): Unit = {
val m = new ju.HashMap[TopicPartition, OffsetAndMetadata]()
var osr = commitQueue.poll()
while (null != osr) {
val tp = osr.topicPartition
val x = m.get(tp)
val offset = if (null == x) { osr.untilOffset } else { Math.max(x.offset, osr.untilOffset) }
m.put(tp, new OffsetAndMetadata(offset))
osr = commitQueue.poll()
}
if (!m.isEmpty) {
consumer.commitAsync(m, commitCallback.get)
}
}
因此,不幸的是,如果要将偏移作为事务提交,则必须将它们单独存储在自己的存储中,而不是使用Kafka内置的偏移提交跟踪 你提到交易。你的意思是如果我不关心事务处理,还有其他可能性吗?@Natalia如果你不介意至少处理一次语义,那么在下一次迭代中提交偏移量就不应该是问题了?问题在于监控。我在处理的偏移量中有一个滞后(滞后永远不会达到0)。@Natalia但它总是一个单批滞后,它有多糟?添加了滞后监控的屏幕截图。我正在考虑如何改进它