如何获得Kafka消费者的抵消?

时间:2017-01-18 08:05:42

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

使用Kafka(v2.11-0.10.1.0)-spark-streaming(v-2.0.1-bin-hadoop2.7)。

我有Kafka Producer和Spark-streaming消费者来制作和消费。一切正常,直到我停止消费(大约2分钟)并重新开始。消费者启动和读取数据,绝对完美。但是,我失去了消费者关闭的2分钟数据。

Kafka consumer / server.properties不变。

Kafka制作人的财产:

            Properties properties = new Properties();
            properties.put("bootstrap.servers", AppCoding.KAFKA_HOST);
            properties.put("auto.create.topics.enable", true);
            properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
            properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
            properties.put("retries", 1);
            logger.info("Initializing Kafka Producer.");
            Producer<String, String> producer = new KafkaProducer<>(properties);
            producer.send(new ProducerRecord<String, String>(AppCoding.KAFKA_TOPIC, "", documentAsString));

使用Spark-streaming api作为:

        SparkConf sparkConf = new SparkConf().setMaster(args[4]).setAppName("Streaming");

        // Create the context with 60 seconds batch size
        JavaStreamingContext jssc = new JavaStreamingContext(sparkConf, new Duration(60000 * 5));

        //input arguments:localhost:2181 sparkS incoming 10 local[*]

        Set<String> topicsSet = new HashSet<>(Arrays.asList(args[2].split(";")));
        Map<String, String> kafkaParams = new HashMap<>();
        kafkaParams.put("metadata.broker.list", args[0]);
        //input arguments: localhost:9092 "" incoming 10 local[*]

        JavaPairInputDStream<String, String> kafkaStream =
                KafkaUtils.createDirectStream(jssc, 
                        String.class,
                        String.class,
                        StringDecoder.class,
                        StringDecoder.class,
                        kafkaParams,
                        topicsSet);

另一方面,我一直在使用ActiveMQ。虽然ActiveMQ Consumer可以在关闭时获取数据。 如果存在配置问题,请帮帮我。

2 个答案:

答案 0 :(得分:0)

在卡夫卡,消费者实际上与生产者没有直接关系。每个消费者都有一个偏移量,用于跟踪分区中消耗的内容。如果消费者没有跟踪偏移量,Kafka会自动将其偏移量重置为最大值,因为config'auto.offset.reset'的默认值。在您的情况下,当启动全新的消费者时,由于默认策略,它不会看到之前生成的消息。您可以将'auto.offset.reset'设置为最早(对于新消费者)或最小(对于旧消费者)。

答案 1 :(得分:0)

Kafka维持每个记录每个分区的偏移量。当消费者关闭2分钟时,偏移值将存储在新消费者的主题元数据中,并且当消费者在2分钟后重新启动时,它将读取存储在kafka主题中的最后一个偏移量。

我认为您需要检查的是kafka broker data retention policy如果小于2分钟,数据将丢失,如果不存在与偏移相对应的数据,它将从最新开始读取,因为默认值设置为最新auto.offset.reset=latest新数据到达。

如果小于2分钟,我建议相应地检查和更改kafka数据保留政策