繁体   English   中英

有没有办法从 Spark 流作业中读取 Kafka 流中的特定偏移量?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM