Anthony Daegele (Anthony)
07/21/2023, 8:15 PMprivate def overrideOffsets(topicName: String)(implicit config: BaseKafkaConfig): OffsetsInitializer = {
val adminClient = AdminClient.create(config.createKafkaBasePropMap.toProperties)
val consumerGroupName =
s"${JarvisKafkaConstants.CONSUMER_GROUP_PREFIX}.${config.getAlternateRegionDesignation}.${config.getProcessorName}"
<http://logger.info|logger.info>(s"Getting offsets for consumer group: $consumerGroupName")
val replicatedTopicOffsetMap = adminClient.listConsumerGroupOffsets(consumerGroupName)
<http://logger.info|logger.info>(s"Retrieved offset map: ${replicatedTopicOffsetMap.partitionsToOffsetAndMetadata().get().toString}")
val offsetMap: collection.Map[TopicPartition, java.lang.Long] = replicatedTopicOffsetMap
.partitionsToOffsetAndMetadata()
.get()
.asScala
.filterKeys(partition => partition.topic() == topicName)
.map { case (partition, offsetAndMetadata) => partition -> long2Long(offsetAndMetadata.offset()) }
<http://logger.info|logger.info>(offsetMap.foldLeft(s"Starting consumer with the following overridden offsets for topic $topicName.") {
case (s: String, (partition, offset)) => s + s"\n${partition.topic()}, ${partition.partition()} -> $offset"
})
OffsetsInitializer.offsets(offsetMap.asJava)
}
And this is the code that creates the kafka source, where the offset initializer is passed in as an input argument:
private def createKafkaSourceWithOffsets(
topicName: String,
startingOffsets: OffsetsInitializer
)(implicit config: BaseKafkaConfig): KafkaSource[String] =
KafkaSource
.builder[String]()
.setTopics(topicName)
.setStartingOffsets(startingOffsets)
.setValueOnlyDeserializer(new SimpleStringSchema())
.setProperties(config.createKafkaConsumerProperties)
.build()Martijn Visser
07/21/2023, 8:30 PMMartijn Visser
07/21/2023, 8:31 PMAnthony Daegele (Anthony)
07/21/2023, 8:39 PMAnthony Daegele (Anthony)
07/21/2023, 8:39 PMAnthony Daegele (Anthony)
07/21/2023, 8:41 PMAnthony Daegele (Anthony)
07/21/2023, 8:42 PMDanny Cranmer
07/21/2023, 8:52 PM.setStartingOffsets(OffsetsInitializer.committedOffsets()). If you cannot change the consumer group then you could use a timestamp .setStartingOffsets(OffsetsInitializer.timestamp(1657256176000L))
In KDA you could externalise the consumer group/timestamp to runtime properties and read when constructing the job graph.Danny Cranmer
07/21/2023, 8:55 PMAnthony Daegele (Anthony)
07/21/2023, 8:56 PMAnthony Daegele (Anthony)
07/21/2023, 8:57 PMDanny Cranmer
07/21/2023, 8:59 PMDanny Cranmer
07/21/2023, 9:00 PMAnthony Daegele (Anthony)
07/21/2023, 9:01 PMAnthony Daegele (Anthony)
07/21/2023, 9:02 PMDanny Cranmer
07/21/2023, 9:02 PMAnthony Daegele (Anthony)
07/24/2023, 4:13 PM