2013-10-16 5 views
9

私はまだ新しいトピックを作成しましたが、まだメッセージを作成していません。 "/ tmp/kafka-logs-1/topicname-0 /"ディレクトリに "00000000000000000000.index"という名前のファイルが作成されており、そのファイルのサイズは非常に大きいです。 バイナリファイルをviで開きましたが、内容は "0000 0000 0000 0000 ..." それはどういう意味ですか?インデックスファイルは何ですか?kafka-logディレクトリに.indexファイルが存在するのはなぜですか?

答えて

22

ログ(ファイル* .logという)のすべてのセグメントは、それが対応するインデックス(ファイル* .INDEX)のしている同じ名前を持つ彼らは、ベースを表してオフセット

理解のために、ログファイルにはメッセージフォーマットで構成された実際のメッセージが含まれています。このファイル内の各メッセージについて、最初の64ビットはインクリメントされたオフセットを表します。ログファイルがギガバイトの範囲で拡大する可能性があるため、特定のオフセットを持つメッセージのこのファイルを検索すると、コストが高くなります。メッセージを生成するためには、ブローカーは実際に最新のオフセットを決定し、着信メッセージをさらに正確に増やすことができるように、そのような種類のルックアップを実際に実行しなければなりません。

これは、インデックスファイルが存在する理由です。まず、インデックスファイル内のメッセージの構造は、それらのそれぞれは、32ビットの長、唯一の2つのフィールドについて説明します。

  1. 4バイト:相対
  2. 4バイトのオフセット:物理的な位置

としては、ファイル名はベースオフセットを表します。各メッセージについてオフセットがインクリメントされるログファイルとは対照的に、インデックスファイル内のメッセージには、ベースオフセットに対する相対オフセットが含まれています。 2番目のフィールドは、関連するログメッセージ(ベースオフセット+相対オフセット)の物理的な位置を表し、O(1)のルックアップが可能になります。

ログ内のすべてのメッセージにインデックス内の対応するメッセージがあるわけではありません。構成パラメーターindex.interval.bytesは、デフォルトで4096バイトで、索引項目を追加する頻度(基本的には何バイト後)を記述する索引間隔を設定します。

.indexファイルのサイズについての質問は次のとおりです。設定パラメータsegment.index.bytes(既定では10MB)は、このファイルのサイズを示します。この領域は再割り当てされ、ログロールの後でのみ縮小されます。

+0

「このスペースは再割り当てされました」とはどういう意味ですか? –

+2

私は* .timeindex *接頭辞を持つファイルがあります気づきました。それは何のためですか? –

+0

timeindexは、オフセット値ではなくタイムスタンプに基づいてすばやくすべてのメッセージにアクセスする方法を提供します。 offsetsForTimes()メソッドを使用してタイムスタンプでオフセットを参照することもできます –

-2

すべてのログファイルには対応するインデックスファイルがあります。インデックスファイルの目的は、論理メッセージオフセットをデータファイルの物理的な位置に変換するために使用されます。 here

EDIT見られるように:DOC

から

を各パーティションには、継続的に、コミットログを構造化追加されたレコードの順序付き、不変のシーケンスです。

カファでは、トピックパーティションを複数のブローカーに分割することはできません。保存期間が過ぎてからKafkaがいくつかのメッセージをパーティションから削除する必要がある状況では、パーティションファイルをスキャンする必要があります。単一の大きなパーティションファイルが存在する場合、この操作は非常に遅くなります。これを避けるため、カフカはパーティションを複数のセグメントに分割します。

アクティブセグメントと呼ばれる現在のセグメントファイルがサイズ制限に達したときに作成される新しいセグメントファイル(log.segment.bytesプロパティによって制御されます)。したがって、各セグメントにはlogファイルとindexファイルが存在します。 すべてのセグメントは、以前のセグメントのオフセットよりも大きいベースオフセットで開始します。

ログファイル00000000005120942793.log

インデックスファイル、(。一度メッセージは、それがOffsetと呼ばれる固有のシーケンシャル番号が与えられているカフカに押し込まれる)カフカは、実際のオフセットのようなすべての詳細と一緒にメッセージを格納する場合に、タイムスタンプであり、圧縮、ペイロード等00000000005120942793.indexは、ログ内の実際のメッセージの位置をマップします。一般に、それぞれが4バイトを有する2つの部分からなる。最初の部分はメッセージオフセット(ベースオフセットに相対)を格納し、後でメッセージの位置を格納します。インデックスファイルはメモリマップされており、Kafkaはバイナリサーチを使用して、ターゲットオフセットと等しいかそれ以下の最も近いオフセットを検索します。

出典:
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

文書とリンクされたコメントから不明瞭な抜粋をコピーしてください。 – cevaris

+0

おそらくあなたは答えで提供されたリンクを逃した – user2720864

+0

いいえ、クオラのリンクを見た。どちらの回答も効果的にOP質問に答えません。この – cevaris

関連する問題