Kafa-SparkStreaming:如何在Spark结构化流中读取和提交Kafka偏移量?

时间:2019-07-12 09:16:11

标签: apache-spark apache-kafka apache-spark-sql spark-streaming kafka-consumer-api

我有一个必须要解决的情况

  1. 使用kafka主题中的数据。
  2. 读取kafka消息的偏移量。
  3. 使用Dataset<Row>对来自上述项目要点1的数据进行一些处理。
  4. 将数据集写入配置单元。
  5. commitAsync()到kafka的偏移量

我已经阅读了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创建的。

谢谢。

0 个答案:

没有答案