2017-08-25 54 views
2

Kafka使用math.abs(key.hashCode)%numPartitions來計算要發送的分區。Kafka的分區選擇算法

如果hashCode爲Integer.MIN_VALUE,該怎麼辦?

由於math.abs(Integer.MIN_VALUE)是一個負數,卡夫卡會發送到負分區。這是如何處理的,我應該關心這個嗎?

+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

其實,當我在kafka代碼中搜索它時,它不使用math.abs()將負值轉換爲正值。

它使用:

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

,因此它可以解決這個問題,你擔心即使號碼是2147483648,它會被轉換爲0

一種廉價的方式向確定性轉換號碼到正值。當輸入爲 爲正時,返回原始值。當輸入數字爲負時,返回的 正值是原始值位AND與0x7fffffff的比值,而不是其絕對值 的值。

+0

真的嗎?哪個版本? – ntysdd

+0

這是java kafka客戶端,它也在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