2013-10-16 16 views
9

Ho appena creato un nuovo argomento, non ho ancora prodotto alcun messaggio. Un file chiamato "00000000000000000000.index" creato nella directory "/ tmp/kafka-logs-1/topicname-0 /", e la dimensione di quel file è veramente grande. Ho aperto quel file binario in vi, e il contenuto è solo "0000 0000 0000 0000 ..." Che cosa significa? qual è il file indice?perché il file .index esiste nella directory kafka-log?

risposta

22

Ogni segmento di un registro (i file * .log) ha il corrispondente indice (i file * .index) con lo stesso nome in quanto rappresentano la base offset.

Per la comprensione, il file di registro contiene i messaggi effettivi strutturati in un formato di messaggio. Per ogni messaggio all'interno di questo file, i primi 64 bit descrivono l'offset incrementato. Ora, cercare questo file per i messaggi con uno specifico offset diventa costoso poiché i file di registro potrebbero crescere nell'intervallo di gigabyte. E per essere in grado di produrre messaggi, il broker deve effettivamente fare questo tipo di ricerche per determinare l'offset più recente ed essere in grado di incrementare ulteriormente i messaggi in arrivo correttamente.

Ecco perché è presente un file di indice. Prima di tutto, la struttura dei messaggi all'interno del file di indice descrive solo 2 campi, ognuno dei quali 32bit lunga:

  1. 4 byte: offset relativo
  2. 4 byte: Posizione fisica

Come descritto in precedenza, il nome del file rappresenta l'offset di base. Contrariamente al file di registro in cui l'offset viene incrementato per ciascun messaggio, i messaggi all'interno dei file di indice contengono un offset relativo all'offset di base. Il secondo campo rappresenta la posizione fisica del relativo messaggio di registro (offset base + offset relativo) e, quindi, diventa possibile una ricerca di O (1).

In fin dei conti, non tutti i messaggi all'interno di un registro hanno il messaggio corrispondente all'interno dell'indice. Il parametro di configurazione index.interval.bytes, che per impostazione predefinita è 4096 byte, imposta un intervallo indice che descrive essenzialmente la frequenza con cui (dopo quanti byte) verrà aggiunta una voce di indice.

Per quanto riguarda la domanda relativa alla dimensione del file .index, è presente quanto segue: Il parametro di configurazione segment.index.bytes, che per impostazione predefinita è 10 MB, descrive la dimensione di questo file. Questo spazio viene riallocato e si restringerà solo dopo i rotoli di registro.

+0

Cosa intendi con "questo spazio viene riallocato"? –

+2

Ho notato che c'è un file con prefisso * .timeindex *. A cosa serve? –

+0

Il timeindex fornisce un modo per accedere rapidamente a qualsiasi messaggio in base al timestamp anziché al valore di offset. È anche possibile cercare un offset per data/ora usando il metodo offsetsempi() –

-2

Ogni file di registro ha un file indice corrispondente, lo scopo del file indice viene utilizzato per tradurre gli offset di messaggi logici in posizioni fisiche nel file di dati. come si è visto here

EDIT:

Dal doc

Ogni partizione è una ordinata, sequenza immutabile di record che viene continuamente aggiunto a-uno strutturato commit di registro.

In Kafka le partizioni dell'argomento non possono essere suddivise tra più broker. Ora nelle situazioni in cui Kafka ha bisogno di cancellare alcuni messaggi dalle partizioni dopo che il periodo di conservazione è finito, ha bisogno di eseguire la scansione attraverso i file delle partizioni. Questa operazione sarà molto lenta nel caso esista un singolo file di partizione di grandi dimensioni. Per evitare questo, Kafka suddivide le partizioni in più segmenti.

Nuovi file di segmento creati quando quello corrente (chiamato segmento attivo) ha raggiunto il limite di dimensioni (controllato dalla proprietà log.segment.bytes). Quindi per ogni segmento è presente un file log e un file index. Ora ogni segmento inizia con il loro offset base che è maggiore dell'offset nei segmenti precedenti.

Il file di registro ad es. 00000000005120942793.log è dove Kafka memorizza effettivamente i messaggi con tutti i dettagli come compensati (una volta che un messaggio viene spinto nella Kafka viene dato un numero sequenziale unico chiamato Offset.), Data e ora, la compressione, ecc payload

I file di indice es 00000000005120942793.index mappare le posizioni dei messaggi effettivi nel registro. Generalmente consiste di due parti ciascuna con 4 byte. La prima parte memorizza l'offset del messaggio (relativo al suo offset base) e successivamente memorizza la posizione del messaggio. I file di indice sono mappati in memoria e Kafka utilizza una ricerca binaria per individuare l'offset più vicino minore o uguale all'offset target.

Fonte:
http://kafka.apache.org/documentation.html#brokerconfigs http://supergsego.com/apache/kafka/0.8.2.0/scaladoc/kafka/log/OffsetIndex.html https://thehoard.blog/how-kafkas-storage-internals-work-3a29b02e026

+0

Copia incolla estratto da documenti e commenti collegati. – cevaris

+0

probabilmente ti sei perso il link fornito con la risposta – user2720864

+0

No, ho visto il link quora. Entrambe le risposte non rispondono in modo efficace alla domanda OP. – cevaris

Problemi correlati