Cosa determina l'offset del consumatore Kafka?


170

Sono relativamente nuovo a Kafka. Ho fatto un po 'di sperimentazione, ma alcune cose non sono chiare per quanto riguarda l'offset del consumatore. Da quello che ho capito finora, quando un consumatore inizia, l'offset da cui inizierà la lettura è determinato dall'impostazione di configurazione auto.offset.reset(correggimi se sbaglio).

Ora, ad esempio, dire che ci sono 10 messaggi (offset da 0 a 9) nell'argomento e che un consumatore ne ha consumati 5 prima che cadesse (o prima che io uccidessi il consumatore). Quindi dire che riavvio quel processo consumer. Le mie domande sono:

  1. Se auto.offset.resetè impostato su smallest, inizierà sempre a consumare dall'offset 0?

  2. Se auto.offset.resetè impostato su largest, inizierà a consumare dall'offset 5?

  3. Il comportamento riguardo a questo tipo di scenario è sempre deterministico?

Non esitate a commentare se qualcosa nella mia domanda non è chiaro. Grazie in anticipo.

Risposte:


260

È un po 'più complesso di quello che hai descritto.
La auto.offset.resetconfigurazione si avvia SOLO se il tuo gruppo di consumatori non ha un offset valido impegnato da qualche parte (2 archivi di offset supportati ora sono Kafka e Zookeeper) e dipende anche dal tipo di consumatore che usi.

Se usi un consumatore Java di alto livello, immagina i seguenti scenari:

  1. Hai un consumatore in un gruppo di consumatori group1che ha consumato 5 messaggi ed è morto. La prossima volta che avvierai questo consumatore non userà nemmeno quella auto.offset.resetconfigurazione e continuerà dal punto in cui è morto perché recupererà l'offset memorizzato dall'archivio offset (Kafka o ZK come ho già detto).

  2. Hai messaggi in un argomento (come hai descritto) e inizi un consumatore in un nuovo gruppo di consumatori group2. Non esiste alcun offset memorizzato da nessuna parte e questa volta la auto.offset.resetconfigurazione deciderà se iniziare dall'inizio dell'argomento ( earliest) o dalla fine dell'argomento ( latest)

Un'altra cosa che influenza il valore di offset earlieste le latestconfigurazioni è la politica di conservazione del registro. Immagina di avere un argomento con conservazione configurato su 1 ora. Produci 5 messaggi, quindi un'ora dopo pubblichi altri 5 messaggi. L' latestoffset rimarrà sempre lo stesso dell'esempio precedente, ma earliestquello non sarà possibile 0perché Kafka rimuoverà già questi messaggi e quindi sarà l'offset più presto disponibile 5.

Tutto ciò di cui sopra non è correlato SimpleConsumere ogni volta che lo esegui, deciderà da dove iniziare utilizzando la auto.offset.resetconfigurazione.

Se si utilizza la versione Kafka più vecchio di 0,9, si deve sostituire earliest, latestcon smallest, largest.


3
Grazie mille per la risposta. Per quanto riguarda il consumatore di alto livello, una volta che un consumatore ha commesso qualcosa (in ZK o Kafka), da allora in poi auto.offset.resetnon ha più alcun significato? L'unico significato di tale impostazione è quando non c'è nulla di commesso (e idealmente sarebbe al primo avvio del consumatore)?
Asif Iqbal,

2
Esattamente come hai descritto
serejja,

1
@serejja Ciao, che ne dici se ho sempre 1 consumatore per gruppo e lo scenario n. 1 della tua risposta appare per me? Sarebbe lo stesso?
ha9u63ar,

1
@ ha9u63ar non ha capito bene la tua domanda. Se riavvii il consumatore nello stesso gruppo, sì, non verrà utilizzato auto.offset.resete continuerà dall'offset impegnato. Se usi sempre un diverso gruppo di consumatori (come auto.offset.reset
generalo

@serejja sì e non funziona per me. potresti per favore dare un'occhiata a questo - questo è il mio problema
ha9u63ar,

83

Solo un aggiornamento: da Kafka 0.9 in poi, Kafka sta usando una nuova versione Java del consumatore e i nomi dei parametri auto.offset.reset sono cambiati; Dal manuale:

Cosa fare quando non esiste un offset iniziale in Kafka o se l'offset corrente non esiste più sul server (ad es. Perché i dati sono stati eliminati):

prima : reimposta automaticamente l'offset alla prima

latest : ripristina automaticamente l'offset all'ultimo offset

nessuno : genera un'eccezione per il consumatore se non viene trovato alcun offset precedente per il gruppo del consumatore

qualsiasi altra cosa: gettare un'eccezione per il consumatore.

Ho trascorso un po 'di tempo a trovarlo dopo aver verificato la risposta accettata, quindi ho pensato che potesse essere utile per la community pubblicarla.


9

Ancora di più c'è offsetsret.retention.minutes. Se il tempo trascorso dall'ultimo commit è> offsets.retention.minutes, auto.offset.resetentra anche in azione


1
non sembra ridondante con la conservazione del registro? la conservazione del set deve essere basata sulla conservazione del registro?
mike01010,

@ mike01010 è vero. Dovrebbe essere basato sulla conservazione dei registri, questa è una delle soluzioni proposte nel ticket. Prolong default value of offsets.retention.minutes to be at least twice larger than log.retention.hours. issues.apache.org/jira/browse/KAFKA-3806
saheb

Quella risposta mi ha spaventato per un po ', fino a quando non controllo la documentazione di offsets.retention.minutes: <b> Dopo che un gruppo di consumatori ha perso tutti i suoi consumatori (ovvero diventa vuoto), le sue compensazioni saranno mantenute per questo periodo di conservazione prima di essere scartate. </b> Per standalone consumatori (utilizzando l'assegnazione manuale), le compensazioni scadranno dopo il tempo dell'ultimo commit più questo periodo di conservazione. (Questo è per Kafka 2.3)
jumping_monkey il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.