2017-08-25 4 views
2

カフカはmath.abs(key.hashCode)%numPartitionsを使用して送信するパーティションを計算します。カフカのパーティション選択アルゴリズム

hashCodeがInteger.MIN_VALUEの場合はどうなりますか?

math.abs(Integer.MIN_VALUE)が負の数であるため、kafkaは負のパーティションに送信します。私はこれをどう扱うべきですか?

+0

あなたが言ったように、まずmath.abs()を使用するので、なぜこのケースについて心配ですか? – GuangshengZuo

+0

それは悪い質問ではありません:repl: 'math.abs(Integer.MIN_VALUE)'よりもお試しください: 'res0:Int = -2147483648' –

+0

関連:https://stackoverflow.com/questions/5444611/math- abs-returns-wrong-value-for-integer-min-value#5444634 –

答えて

1

実際に、これをカフカコードで検索すると、math.abs()を使用して、ネガをポジティブに変換しません。

それはそれを使用します。

public static int toPositive(int number) { 
    return number & 0x7fffffff; 
} 

だからそれは数が2147483648である場合でも、あなたは心配して問題を解決することができ、それは0

確定数を変換する安価な方法に変換されます。正の値にする。入力が の場合、元の値が返されます。入力番号が負の場合、返された の正の値は元の値のビットであり、0x7fffffffとは絶対的に の値ではありません。

+0

本当ですか?どのバージョン? – ntysdd

+0

これはkafkaコードベースにも入っているjava kafkaクライアントです。 https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/common/utils/Utils.javaにあります。これは新しい機能ではありません。 – GuangshengZuo

+0

defaultPartitionerはhttps://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/producer/internals/DefaultPartitionerにあります。 .java – GuangshengZuo

関連する問題