![](/img/trans.png)
[英]Spark streaming job stuck if some Kafka nodes time offset is not synchronized
[英]Is there a way to read from specific offset in a Kafka stream from a Spark streaming job?
我正在尝试使用以下方法将我的 Spark 流作业的偏移量提交给 Kafka:
OffsetRange[] offsetRanges = ((HasOffsetRanges) rdd.rdd()).offsetRanges();
// some time later, after outputs have completed
((CanCommitOffsets) stream.inputDStream()).commitAsync(offsetRanges);
正如我从这个问题中得到的:
来自 Kafka 的 Spark DStream 总是从头开始
这工作正常,正在提交偏移量。 然而,问题在于这是异步的,这意味着即使在发送了另外两次偏移提交之后,Kafka 仍然可能保持之前两次提交的偏移。 如果消费者在那个时候崩溃了,我把它恢复过来,它就会开始读取已经处理过的消息。
现在,从其他来源,比如这里的评论部分:
https://dzone.com/articles/kafka-clients-at-most-once-at-least-once-exactly-o
我知道无法从 Spark 流作业同步提交偏移量(尽管如果我使用 Kafka 流,则有一个)。 人们宁愿建议将偏移量保留在数据库中,您将计算的最终结果保留在流中。
现在,我的问题是:如果我确实将当前读取的偏移量存储在我的数据库中,那么下次我如何从该偏移量开始读取流?
我进行了研究并找到了我的问题的答案,因此我将其发布在这里供其他可能面临相同问题的人使用:
创建一个 Map 对象,以 org.apache.kafka.common.TopicPartition 作为键,一个 Long 作为值。 TopicPartition 构造函数接受两个参数,主题名称和您将读取的分区。 Map 对象的值是您要从中读取流的偏移量的长表示形式。
映射开始偏移 = 新的 HashMap<>(); 起始偏移量.put(新主题分区(“主题名称”,0),3332980L);
将流内容读入适当的 JavaInputStream,并将先前创建的 Map 对象作为参数提供给 ConsumerStrategies.Subscribe() 方法。
最终 JavaInputDStream> 流 = KafkaUtils.createDirectStream(jssc, LocationStrategies.PreferConsistent(), ConsumerStrategies.Subscribe(topics, kafkaParams,startingOffset));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.