2013-02-22 23 views
8

Napisałem niestandardowy program do partycjonowania. Kiedy mam liczbę zadań redukcji większych niż 1, zadanie się nie udaje. Jest to wyjątek, który dostaję:Jak naprawić błąd "Nielegalna partycja" w hadoopie?

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) 

kod, który napisałem jest

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

to, że key.hashCode() równa -719988079 i mod tej wartości wraca -1.

Doceń swoją pomoc w tej sprawie. Dzięki.

Odpowiedz

21

Obliczony numer partycji według niestandardowego Partitioner musi być nieujemny. Spróbuj:

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

Wielkie dzięki. Zadziałało :) – Maverick

+0

@SumanBharadwaj Nie ma za co! Proszę oznaczyć odpowiedź jako zaakceptowaną. Dzięki :) – harpun

+0

To pytanie otrzymało 3 odpowiedzi - dwie prawidłowe i jedna niepoprawna. Szkoda, że ​​jedyny niewłaściwy otrzymał najlepszy wynik i zaakceptowany znak odpowiedzi. –

2

Albo można użyć

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

Dzięki. Zaktualizowałem swoją odpowiedź z twoją sugestią. – harpun

4

ostrzeżenie o użyciu:

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

Jeśli trafisz przypadek, w którym key.hashCode() jest równa Integer.MIN_VALUE będzie wciąż ujemny wartość partycji. Jest to osobliwość Java, ale Math.abs(Integer.MIN_VALUE) zwraca Integer.MIN_VALUE (jak w -2147483648). Jesteś bezpieczniejszy, biorąc bezwzględną wartość modułu, jak w:

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