シリアライズ後の形式を選ぶ
UTF-8では空白と改行も入力の一部です。16進数はASCII空白を挟めますが、0xを付けず完全な2桁単位で指定します。Base64は必要なパディングを付けます。形式変更は再解釈であり、入力の変換ではありません。
Protocols & Binary Serialization
キーとパーティション総数を指定し、Java互換Murmur2の計算を追跡します。
空白や改行もそのまま使います。空のバイト列は有効です。キーが存在しない場合はnullを選んでください。
68 65 6c 6c 6f
計算はこのブラウザー内で完結します。キーを送信・保存せず、Kafkaクラスターにも接続しません。
Java互換のキー付きMurmur2ルーティングを対象にします。明示的な送信先、キーの無視、独自のシリアライザーやパーティショナーでは結果が異なる場合があります。
計算が完了しました。
同じ顧客IDのはずなのに、別のパーティションに届いている。そんなときは表示文字列だけでなく、シリアライズ後の内容を比べる必要があります。Kafkaパーティション計算では、送信先に至る前のハッシュ値まで確認できます。
パーティションキーが整数や構造化データなら、見た目をコピーしても同じバイト列にはなりません。シリアライザーの出力を16進数やBase64で入力すれば、文字列表現の違いを切り分けられます。
Kafkaパーティション計算は3種類の入力を同じバイト列に揃えてから計算します。末尾の改行や空白、複数バイトの文字が含まれていても、16進プレビューなら具体的な差を追えます。同じバイト列なら入力形式を変えてもハッシュは一致します。
空文字列のUTF-8表現は長さ0のバイト配列です。nullは配列自体が存在しない状態です。前者には固定のハッシュ計算ができますが、後者はプロデューサーの実行状態に依存するため、固定番号を表示しません。
UTF-8では空白と改行も入力の一部です。16進数はASCII空白を挟めますが、0xを付けず完全な2桁単位で指定します。Base64は必要なパディングを付けます。形式変更は再解釈であり、入力の変換ではありません。
初期値12は操作例であり、推奨構成ではありません。番号は0始まりなので、12個なら0から11です。総数が変わるとハッシュが同じでも剰余が変わり、今後の書き込み先が変わる可能性があります。
テストベクトルからabcやfoobarを読み込むと、公式の符号付きハッシュと比較できます。自動計算は350msの待ち時間後に実行されます。無効にすればCtrl/Cmd + Enterで実行でき、古い結果の出力は防がれます。
Murmur2はシード0x9747b28cとリトルエンディアンの4バイト単位を使用します。乗算は32ビットです。符号付きと符号なしは同じビット列の表示方法であり、送信先の計算では0x7fffffffで符号ビットを除きます。絶対値への変換とは異なります。
標準Base64と16進数は00やffを含む任意のバイト列を扱えます。奇数桁、誤ったパディング、Base64の不正な末尾ビットは拒否します。テキストは大文字小文字やUnicode形式を変更しないため、意図しない補正が入りません。
abc、foobar、21にApache Kafkaの固定参照値を表示します。バイト列は最初の100バイトから100ずつ展開できます。JSONには全バイト、形式、キーの種類、パーティション総数と中間値が含まれます。
対象のキー付きルーティングでは、シリアライズ済みバイト列のMurmur2を計算し、符号ビットを除いてから総数で剰余を取ります。abcの符号付きハッシュは479470107で、12パーティションなら番号3です。総数は実際のメタデータと照合してください。
あります。宛先の数は有限なので、多くのキーが同じ番号を共有します。32ビットハッシュ全体が一致する必要はなく、異なる値でも剰余は一致します。同じパーティションに入ったことだけでは、キーが等しいとは判断できません。
バイト列、パーティション総数、クライアントのアルゴリズムを順に比べます。同じ表示文字列でもシリアライズ結果が違う場合があります。明示的な番号やキーを無視する設定も確認してください。コンシューマーのリバランス自体はハッシュ式を変更しません。
必須ではありません。キーを使うかどうかは、レコードのグループ化や順序の要件によります。キーなしでも送信できますが、その送信先をこのキー付きハッシュ式だけで決めることはできません。空文字列はキーなしとは別の入力です。
クライアントのバージョンと設定、バッチなどの実行状態に依存します。現行のJavaプロデューサーにはsticky動作があり、他のクライアントにも固有の方式があります。このページはnullに固定の番号を割り当てません。
KafkaのこのMurmur2実装では、シード0x9747b28cを固定して使います。同じバイト列ならハッシュは再現できます。ただし、パーティション総数が変われば剰余が変わり、別のパーティショナーなら別の規則で送信先を選ぶことがあります。
計算や入力判定に問題がありましたか?