Apache kafka 使用偏移量恢复卡夫卡中丢失的消息

Apache kafka 使用偏移量恢复卡夫卡中丢失的消息,apache-kafka,spark-streaming,Apache Kafka,Spark Streaming,我在一次采访中被问到这个问题 假设一个数据包由于故障(不确定其使用者故障或代理)而丢失。在这段时间内,使用偏移量恢复丢失的消息应该做些什么(代码实现) 很抱歉,我的问题可能不清楚,因为有人以类似的方式问我 感谢Kafka至少遵循了一次消息传递语义,这意味着您可能会在代理失败时得到重复的消息,您不会丢失数据 但是,当您创建Kafka Producer时,如果此属性为0,则它将仅尝试发送一次,即使在代理失败的情况下,它也不会尝试重新发送。因此,如果代理失败,您可能会丢失数据 props.put("r

我在一次采访中被问到这个问题

假设一个数据包由于故障(不确定其使用者故障或代理)而丢失。在这段时间内,使用偏移量恢复丢失的消息应该做些什么(代码实现)

很抱歉,我的问题可能不清楚,因为有人以类似的方式问我


感谢

Kafka至少遵循了一次
消息传递语义,这意味着您可能会在代理失败时得到重复的消息,您不会丢失数据

但是,当您创建
Kafka Producer
时,如果此属性为0,则它将仅尝试发送一次,即使在代理失败的情况下,它也不会尝试重新发送。因此,如果代理失败,您可能会丢失数据

props.put("retries", 0);
因此,您可以将此属性值更改为1,这样它将再次尝试发送,并且
偏移量
在Zookeeper中自动管理,如果消息仅成功传递,它将更新
Zookeeper
中的偏移量

另外,由于您提到了SPark Streaming来消费,SPark Streaming支持两种不同的方法

1。基于接收器: 偏移在Zookeeper中处理

2。直接进近: 偏移量在存储消息的地方进行本地处理,而且这种方法支持一次消息传递


有关更多信息,请检查此

如果您知道要恢复的邮件的偏移量,以及它属于哪个分区,您可以使用
KafkaConsumer
方法
seek

consumer.seek(new TopicPartition("topic-name", partNumber), offsetNumber);
详细的

poll()
的下一个调用将为您提供列表中第一个错过的消息


这只适用于您首先自己管理偏移的场景。如果你让卡夫卡管理偏移量,你可能不知道偏移量的数字,最好的结果可能是消息被消耗了两次(调用
poll()
将从上次提交的偏移量开始消耗)。

阅读了大量文章和文档后,我觉得最好的答案可能是:

使用不带接收器的新型Spark Kafka耗电元件(Spark-streaming-Kafka-0-10_2.11)。在这种方法中,我们可以从我们想要阅读的地方给出startOffset

val offsetRanges=Array(//主题,分区,包括开始 偏移量,独占结束偏移量偏移范围(“测试”,0,0,100),
偏移范围(“测试”,1,0,100))

val rdd=KafkaUtils.createDirectStream[String,String](sparkContext, 卡夫卡帕兰、偏移范围、一致性)

读取和处理消息后,获取读取的偏移量并将其存储在Kafka或Zk或外部事务数据库中

offsetRanges=rdd.asInstanceOf[HasOffsetRanges].offsetRanges

每次启动作业时,从数据库中获取偏移量,并将其传递给createDirectStream,使其具有exacly once机制

更多阅读