Spark Kafka流媒体消费者-延迟向Kafka提交补偿

时间:2019-02-06 23:04:21

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

我正在使用KafkaUtils.createDirectStream读取流消息,并使用commitAsync在处理后(即,将它们加载到Hive表之后)提交偏移量。 我看到配置单元加载和偏移提交之间存在一定的时间间隔,大约是半分钟到一分钟。 另一件事是,commit方法以一定的频率被触发。 如上所述,它每半分钟1分钟就会触发一次,它与传入数据的时间/频率无关。

因此,在这种情况下,如果在存储偏移量的同时我的应用程序被杀死,那么它恰巧再次读取了该特定批次的数据。 我可以控制提交偏移量(即commitAsyn被触发)的时间/频率,以减少延迟吗? 还是您认为commitSync在这种情况下会有所帮助?如果可以,我可以将commitSync与KafkaUtils.createDirectStream一起使用来读取消息吗?您能否提供一个示例,说明如何使用KafkaUtils.createDirectStream实现commitSync API?

public void method1(SparkConf conf,String app) 
spark = SparkSession.builder().appName(conf.get("")).enableHiveSupport().getOrCreate();
final JavaStreamingContext javaStreamContext = new JavaStreamingContext(context,
            new Duration(<spark duration>));
JavaInputDStream<ConsumerRecord<String, String>> recs= KafkaUtils.createDirectStream(javaStreamContext,
            LocationStrategies.PreferConsistent(),
            ConsumerStrategies.<String, String> Subscribe(<topicnames>, <kafka Params>));
recs.foreachRDD(rdd -> {
        OffsetRange[] offsetRanges = ((HasOffsetRanges)rdd.rdd()).offsetRanges();
        JavaRDD<String> javardd = rdd.map(tuple2 -> tuple2.value() );
        if(!javardd.isEmpty()) {
           JavaRDD<String> cache = javardd.cache();
            <MethodToLoadIntoHive>
          ((CanCommitOffsets)recs.inputDStream()).commitAsync(offsetRanges);
        }
    });
javaStreamContext.start();
javaStreamContext.awaitTermination();

}

0 个答案:

没有答案