繁体   English   中英

如何使用Spark的Kafka直接流设置消费者群体提交的偏移量?

[英]How to set offset committed by the consumer group using Spark's Direct Stream for Kafka?

我正在尝试使用Spark的直接方法(无接收器)用于Kafka ,我有以下Kafka配置图:

configMap.put("zookeeper.connect","192.168.51.98:2181");
configMap.put("group.id", UUID.randomUUID().toString());
configMap.put("auto.offset.reset","smallest");
configMap.put("auto.commit.enable","true");
configMap.put("topics","IPDR31");
configMap.put("kafka.consumer.id","kafkasparkuser");
configMap.put("bootstrap.servers","192.168.50.124:9092");

现在我的目标是,如果我的Spark管道崩溃并再次启动,则应该从使用者组提交的最新偏移量开始流。 因此,为此目的,我想为消费者指定起始偏移量。 我有关于每个分区中提交的偏移量的信息。 我如何将此信息提供给流功能。 目前我正在使用

JavaPairInputDStream<byte[], byte[]> kafkaData =
   KafkaUtils.createDirectStream(js, byte[].class, byte[].class,
     DefaultDecoder.class, DefaultDecoder.class,configMap,topic); 

Spark API文档中查看createDirectStream的第二种形式 - 它允许您传入Map<TopicAndPartition, Long> ,其中Long是偏移量。

请注意,使用DirectInputStream时,Spark不会自动更新Zookeeper中的偏移量 - 您必须自己将它们写入ZK或其他数据库。 除非您严格要求完全一次语义,否则使用createStream方法更容易获取DStream,在这种情况下,Spark将更新ZK中的偏移量,并在发生故障时从最后存储的偏移量中恢复。

根据您的要求,正确的解决方案是使用检查点。 对于每个已处理的RDDStream,检查点都会将元数据写入指定的共享存储(通常为hdfs)。 它的元数据,而不是真实的数据,所以没有真正的性能影响。

如果火花过程崩溃并重新启动,它将首先读取检查点并从检查点保存的偏移量中恢复。

你可以参考我使用spark streaming的示例代码,使用checkpoint将数据写入elasticsearch。 https://github.com/atulsm/Test_Projects/blob/master/src/spark/StreamingKafkaRecoverableDirectEvent.java

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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