我有一个必须要解决的情况
Dataset<Row>
对来自上述项目要点1的数据进行一些处理。我已经阅读了kafka-sparkStreaming文档,但它解释了使用RDD进行偏移量读写的情况。
JavaInputDStream<ConsumerRecord<String, String>> stream = KafkaUtils.createDirectStream(
streamingContext,
LocationStrategies.PreferConsistent(),
ConsumerStrategies.<String, String>Subscribe(topics, kafkaParams)
);
stream.foreachRDD(rdd -> {
OffsetRange[] offsetRanges = ((HasOffsetRanges) rdd.rdd()).offsetRanges();
rdd.foreachPartition(consumerRecords -> {
OffsetRange o = offsetRanges[TaskContext.get().partitionId()];
System.out.println(
o.topic() + " " + o.partition() + " " + o.fromOffset() + " " + o.untilOffset());
});
// code for all transformations etc
// some time later, after outputs have completed
((CanCommitOffsets) stream.inputDStream()).commitAsync(offsetRanges);
});
如何在结构化流媒体中实现这一目标?
对于要点1,说,我有
Dataset<Row> ds = spark.readStream()
.format("kafka")
.option("kafka.bootstrap.servers", "host1:port1,host2:port2")
.option("subscribe", "mytopic")
.load();
对于要点2,我如何获得所有消耗的消息的OffsetRange[]
?
对于第5点,我如何将这些偏移量提交给kafka?
我不能在这里使用((CanCommitOffsets) stream.inputDStream()).commitAsync(offsetRanges);
,因为stream
对象是从JavaInputDStream
创建的。
谢谢。