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但它总是一个单批滞后,它有多糟?添加了滞后监控的屏幕截图。我正在考虑如何改进它