2013-10-16 24 views
9

Właśnie napisałem nowy temat, nie napisałem jeszcze żadnej wiadomości. Plik o nazwie "00000000000000000000.index" utworzony w katalogu "/ tmp/kafka-logs-1/topicname-0 /", a rozmiar tego pliku jest naprawdę duży. Otworzyłem ten plik binarny w vi, a jego zawartość to tylko "0000 0000 0000 0000 ..." Co to znaczy? co to jest plik indeksu?dlaczego plik .index istnieje w katalogu kafka-log?

Odpowiedz

22

Każdy segment dziennika (pliki * .log) jest to odpowiedni indeks (pliki * .Index) o tej samej nazwie, ponieważ stanowią one podstawę przesunięcie.

Dla zrozumienia, plik dziennika zawiera rzeczywiste wiadomości uporządkowane w formacie wiadomości. Dla każdej wiadomości w tym pliku pierwsze 64 bity opisują inkrementowane przesunięcie. Teraz wyszukiwanie tego pliku dla wiadomości z określonym przesunięciem staje się kosztowne, ponieważ pliki dzienników mogą rosnąć w zakresie gigabajtów. Aby móc generować komunikaty, broker musi wykonać takie wyszukiwania, aby określić ostatnie przesunięcie i móc dalej prawidłowo zwiększać przychodzące wiadomości.

Dlatego istnieje plik indeksu. Przede wszystkim struktura wewnątrz pliku indeksu wiadomości opisuje tylko 2 pola, każde z nich 32bit długa:

  1. 4 bajty: względne przesunięcie
  2. 4 bajty: Stanowisko fizyczny

Jak opisany wcześniej, nazwa pliku reprezentuje przesunięcie bazy. W przeciwieństwie do pliku dziennika, w którym przesunięcie jest zwiększane dla każdej wiadomości, wiadomości w plikach indeksowych zawierają względne przesunięcia względem przesunięcia bazowego. Drugie pole reprezentuje fizyczną pozycję powiązanego komunikatu dziennika (przesunięcie podstawowe + względne przesunięcie), a zatem możliwe staje się wyszukiwanie O (1).

Po tym wszystkim należy wspomnieć, że nie każda wiadomość w dzienniku ma odpowiednią wiadomość w indeksie. Parametr konfiguracyjny index.interval.bytes, który domyślnie wynosi 4096 bajtów, ustawia interwał indeksowania, który zasadniczo opisuje, jak często (po ilu bajtach) zostanie dodany wpis indeksu.

Odnosząc się do pytania o rozmiar pliku .index, można powiedzieć: Parametr konfiguracyjny segment.index.bytes, który domyślnie ma rozmiar 10 MB, opisuje rozmiar tego pliku. To miejsce zostanie ponownie przydzielone i zmniejszy się dopiero po zakończeniu dziennika.

+0

Co masz na myśli mówiąc "ta przestrzeń jest ponownie przydzielona"? –

+2

Zauważyłem, że istnieje plik z prefiksem * .timeindex *. Po co to jest ? –

+0

Timeindex zapewnia szybki dostęp do każdej wiadomości na podstawie znacznika czasu zamiast wartości przesunięcia. Możesz nawet wyszukiwać offset za pomocą znaczników czasu, używając metody offsetsForTimes() –

-2

Każdy plik dziennika ma odpowiedni plik indeksu, a jego przeznaczeniem jest tłumaczenie logicznych przesunięć komunikatów na fizyczne pozycje w pliku danych. widzianych here

EDIT:

Od doc

Każda partycja jest uporządkowana, niezmienna kolejność zapisów, które są stale dołączany do-a zorganizowany popełnić dziennik.

W Kafce partycje tematyczne nie mogą być podzielone na wiele brokerów. Teraz w sytuacjach, w których Kafka musi usunąć niektóre wiadomości z partycji po upływie okresu przechowywania, musi przeskanować pliki partycji. Ta operacja będzie bardzo powolna w przypadku istnienia pojedynczego dużego pliku partycji. Aby tego uniknąć, Kafka dzieli partycje na wiele segmentów.

Nowe pliki segmentów utworzone, gdy bieżący (nazywany aktywnym segmentem) osiągnął limit rozmiaru (kontrolowany przez właściwość log.segment.bytes). Tak więc dla każdego segmentu znajduje się plik log i plik index. Teraz każdy segment rozpoczyna się od offsetu podstawowego, który jest większy niż przesunięcie w poprzednich segmentach.

Plik z pliku np.00000000005120942793.log jest gdzie Kafka faktycznie przechowuje wiadomości wraz ze wszystkimi szczegółami jak offset (raz wiadomość jest wsuwany Kafka on nadawany jest niepowtarzalny numer sekwencyjny o nazwie Offset.), Datownik, kompresja, ładowność itp

The plików indeksowych np 00000000005120942793.index mapuje aktualne pozycje wiadomości w dzienniku. Zwykle składa się z dwóch części, z których każda ma 4 bajty. Pierwsza część przechowuje przesunięcie komunikatu (względem jego przesunięcia bazowego), a później przechowuje pozycję wiadomości. Pliki indeksu są odwzorowywane w pamięci, a Kafka używa wyszukiwania binarnego, aby zlokalizować najbliższe przesunięcie mniejsze lub równe przesunięciu docelowemu.

Źródło:
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

Skopiuj wklejony fragment z dokumentami i połączonym komentarzem. – cevaris

+0

Prawdopodobnie przegapiłeś link podany przy odpowiedzi – user2720864

+0

Nie, zobaczyłem link quora. Obie odpowiedzi nie odpowiadają skutecznie na pytanie OP. – cevaris