離去年寫了有關偏移量有關文章快一年了,但最近在偏移量方面遇到了些小問題,在這裏記錄下。還有關於偏移量半自動提交,是個很經典的問題,順便也記錄下。
關於拉取指定偏移量
應該只有用consumer.assign(topicPartitionList);和consumer.seek(topicPartition,offset);這種指定分區的方法才能指定偏移量。
在sparkstreaming中同樣也是用assign的方法提交的最後實現拉取指定偏移量的方法。
KafkaUtils.createDirectStream(JSSC, LocationStrategies.PreferConsistent(),
ConsumerStrategies.Assign(topicPartitionList, kafkaParams, repairOffset));
但是在這個過程中,配置的自動提交偏移量失去作用,必須手動提交偏移量,即使用consumer.commitAsync();。
半自動提交偏移量
在任務執行結束後提交一次偏移量,同時在執行失敗後提交一次偏移量,儘量保證偏移量不丟失,
try {
while(true) {
consumerRecords = this.consumer.poll(100);
for (ConsumerRecord<String, String> record : consumerRecords) {
String value = record.value();
if (StringUtils.isNotBlank(value)) {
//業務邏輯
}
consumer.commitAsync();
}
}
}catch (Exception e) {
System.out.println("commit failed");
} finally {
try {
consumer.commitSync();
} finally {
consumer.close();
}
}
問題:
之前因爲環境調整,在卸載kafkamanager的時候,新建了一個groupid。但在重裝kafkamanager後,這個groupid丟失。具體原因有待排查。