我正在使用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();
}