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机制
更多阅读