2013-02-22 18 views
8

Özel bir bölümleyici yazdım. 1'den büyük görevleri azaltma görevim olduğunda, iş başarısız oluyor. Bu alıyorum istisnadır:Hadoop'ta "Geçersiz bölümleme" hatası nasıl düzeltilir?

java.io.IOException: Illegal partition for [email protected] (-1) 
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:930) 
at org.apache.hadoop.mapred.MapTask$OldOutputCollector.collect(MapTask.java:499) 

yazdım kodu

public int getPartition(weburl_compositeKey key, Text value, int numPartitions) 
{ 
    return (key.hashCode()) % numPartitions; 
} 

Bu key.hashCode()-719988079 eşittir ve bu değerin mod -1 dönen olmasıdır.

Bu konuda yardımlarınız için teşekkür ederiz. Teşekkürler.

cevap

21

Hesaplanan bölüm numarası özel Partitioner numaranızın negatif olmaması gerekir.

public int getPartition(weburl_compositeKey key, Text value, int numPartitions) 
{ 
    return (key.hashCode() & Integer.MAX_VALUE) % numPartitions; 
} 
+0

Çok teşekkürler. Çalıştı :) – Maverick

+0

@SumanBharadwaj Hoş Geldiniz! Lütfen cevabı kabul edildi olarak işaretleyin. Thanks :) – harpun

+0

Bu soru 3 cevap aldı - iki doğru ve bir yanlış. Çok kötü tek yanlış kişi en iyi skoru ve kabul edilen cevap işaretini aldı. –

2

Yoksa kullanma hakkında

public int getPartition(weburl_compositeKey key, Text value, int numPartitions) 
{ 
    return (key.hashCode() & Integer.MAX_VALUE) % numPartitions; 
} 
+0

Teşekkürler. Cevabımı önerinizle güncelledim. – harpun

4

bir uyarı kullanabilirsiniz:: Deneyin Eğer key.hashCode() hala bir negatif alacak Integer.MIN_VALUE eşittir davayı vurursanız

public int getPartition(weburl_compositeKey key, Text value, int numPartitions) 
{ 
    return Math.abs(key.hashCode()) % numPartitions; 
} 

bölüm değeri. Bu, Java'nın bir tuhaflığıdır, ancak Math.abs(Integer.MIN_VALUE), Integer.MIN_VALUE değerini döndürür (-2147483648'de olduğu gibi). Modülün mutlak değerini daha güvenli bir şekilde alıyorsunuz, şu şekilde:

public int getPartition(weburl_compositeKey key, Text value, int numPartitions) 
{ 
    return Math.abs(key.hashCode() % numPartitions); 
} 
İlgili konular