Kafka offset commit not working?

Viewed 305

I'm using a Kafka direct stream to read logs from Kafka.

KafkaUtils.createDirectStream(streamingContext, LocationStrategies.PreferConsistent(), ConsumerStrategies.<String, String>Subscribe(topics, kafkaParams));

And, during the processing, if there's any problem with the processing in any partition, I create new offsets so the logs should appear as not processed and I can retry (or that's my idea)

Here's the code for that part:

 dStream.foreachRDD((JavaRDD<ConsumerRecord<String, String>> rdd) -> {
            OffsetRange[] offsets = ((HasOffsetRanges) rdd.rdd()).offsetRanges();

            LOG.info(Arrays.toString(offsets));

            if (!rdd.isEmpty()) {

                JavaRDD<OffsetRange> rddUploadResult = rdd.mapPartitions((FlatMapFunction<Iterator<ConsumerRecord<String, String>>, OffsetRange>) iterator -> {

                // Some processing...

                    Result result = worker.call();

                    OffsetRange partitionOffset = offsets[TaskContext.getPartitionId()];

                    if (result.isSuccessful()) {
                        LOG.info("Batch successful. Committing offsets.");
                        return Collections.singletonList(partitionOffset).iterator();
                    } else {
                        LOG.info("Batch unsuccessful. Creating new offsets.");

                        return Collections.singletonList(OffsetRange.create(partitionOffset.topicPartition(), partitionOffset.fromOffset(), partitionOffset.fromOffset())).iterator();
                    }
                });

                OffsetRange[] newOffsets = rddUploadResult.collect().toArray(new OffsetRange[0]);

                LOG.info("NEW OFFSETS: {}", Arrays.toString(newOffsets));

                // Update offsets
                ((CanCommitOffsets) dStream.inputDStream()).commitAsync(newOffsets);

            } else {
                LOG.debug("Nothing to do...");
            }
        });

But when I run it, this is the output:

# Init state [OffsetRange(topic: 'raul-2', partition: 1, range: [4 -> 4]]

2017-10-03 12:14:40,262 INFO  [streaming-job-executor-0] reader.KafkaConsumer (KafkaConsumer.java:lambda$initStream$2b398ea6$1(73)) - [OffsetRange(topic: 'raul-2', partition: 1, range: [4 -> 4]), OffsetRange(topic: 'raul-2', partition: 0, range: [4 -> 4])]

# New log! [OffsetRange(topic: 'raul-2', partition: 1, range: [4 -> 5]]

2017-10-03 12:14:50,269 INFO  [streaming-job-executor-0] reader.KafkaConsumer (KafkaConsumer.java:lambda$initStream$2b398ea6$1(73)) - [OffsetRange(topic: 'raul-2', partition: 1, range: [4 -> 5]), OffsetRange(topic: 'raul-2', partition: 0, range: [4 -> 4])]

2017-10-03 12:14:52,855 WARN  [Executor task launch worker for task 2] writer.S3Uploader (Worker.java:multipartUpload(31)) - Failed Bundle{data = fail }

# Processing fails so I don't want to mark this as processed

2017-10-03 12:14:52,855 INFO  [Executor task launch worker for task 2] reader.KafkaConsumer (KafkaConsumer.java:lambda$null$46bbe1a2$1(94)) - Batch unsuccessful. Creating new offsets.

# Go back to init state [OffsetRange(topic: 'raul-2', partition: 1, range: [4 -> 4]]

2017-10-03 12:14:52,859 INFO  [streaming-job-executor-0] reader.KafkaConsumer (KafkaConsumer.java:lambda$initStream$2b398ea6$1(105)) - NEW OFFSETS: [OffsetRange(topic: 'raul-2', partition: 1, range: [4 -> 4]), OffsetRange(topic: 'raul-2', partition: 0, range: [4 -> 4])]

# Offsets read in next batch [OffsetRange(topic: 'raul-2', partition: 1, range: [5 -> 5]] ??

lambda$initStream$2b398ea6$1(73)) - [OffsetRange(topic: 'raul-2', partition: 1, range: [5 -> 5]), OffsetRange(topic: 'raul-2', partition: 0, range: [4 -> 4])]
0 Answers
Related