我正在处理kafka消息,并使用带有手动偏移提交的火花流将其插入kudu表中。
val topicsSet = topics.split(",").toSet
val kafkaParams = Map[String, Object](
ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG -> brokers,
ConsumerConfig.GROUP_ID_CONFIG -> groupId,
ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG -> classOf[StringDeserializer],
ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG -> classOf[StringDeserializer],
ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG -> (false: java.lang.Boolean),
ConsumerConfig.AUTO_OFFSET_RESET_CONFIG -> "earliest" //"latest" //"earliest"
)
val stream = KafkaUtils.createDirectStream[String, String](
ssc,
PreferConsistent,
Subscribe[String, String](topicsSet, kafkaParams)
)
stream.foreachRDD { rdd =>
var offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
//offsetRanges.foreach(println)
var msgOffsetsRdd = rdd.map(msg =>{
val msgOffset = OffsetRange(msg.topic(), msg.partition(), msg.offset(), msg.offset()+1)
println(msg)
msgOffset
}
)
val msgOffsets = msgOffsetsRdd.collect() //here idea was to get only processed messages offsets for commit
stream.asInstanceOf[CanCommitOffsets].commitAsync(msgOffsets)
}
让我们在此示例中列出表格在将数据插入kudu时,出现错误,我需要再次处理这些消息,如果我停止工作并再次启动它,我将能够收到未提交的消息,而我们无法收到所有未提交的消息。流?
答案 0 :(得分:0)
您已收到消息,为什么在失败的情况下不放置重试逻辑。 重新连接时,如果用户崩溃,Kafka会给您同样的消息。不确定连接仍处于打开状态时,Kafka是否会给您同样的消息。
如果失败是由于目标数据存储区不可用导致的,则您的代码中可以包含一些重试逻辑,或者如果插入失败的错误消息格式,则可以将这些消息保存到临时缓存,数据存储区或另一个kafka主题中以进行重试以后再检查这些消息有什么问题。