2013-02-22 38 views
8

मैंने एक कस्टम विभाजनकर्ता लिखा है। जब मेरे पास 1 से अधिक कार्यों को कम करने की संख्या है, तो नौकरी विफल हो रही है। यह अपवाद जो मैं हो रही है:हडूप में "अवैध विभाजन" त्रुटि को कैसे ठीक करें?

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) 

कोड जो मैं लिखा है

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

यह key.hashCode()-719988079 के बराबर होती है और इस मूल्य का आधुनिक -1 लौट रहा है।

इस पर आपकी सहायता की सराहना करें। धन्यवाद।

उत्तर

21

आपके कस्टम Partitioner द्वारा गणना की गई विभाजन संख्या को गैर-नकारात्मक होना चाहिए। प्रयास करें:

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

बहुत बहुत धन्यवाद। यह काम किया :) – Maverick

+0

@ सुमनभारद्वाज आपका स्वागत है! उत्तर को स्वीकृत के रूप में चिह्नित करें। धन्यवाद :) – harpun

+0

इस प्रश्न को 3 उत्तरों मिले - दो सही और एक गलत। बहुत बुरा एकमात्र गलत व्यक्ति को सर्वश्रेष्ठ स्कोर और स्वीकार्य उत्तर चिह्न प्राप्त हुआ। –

2

या आप

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

धन्यवाद। मैंने आपके सुझाव के साथ अपना जवाब अपडेट किया। – harpun

4

एक चेतावनी का उपयोग कर सकते उपयोग के बारे में: आप इस मामले में जहां key.hashCode()Integer.MIN_VALUE के बराबर आप अभी भी एक नकारात्मक मिल जाएगा है हिट

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

विभाजन मूल्य यह जावा की एक विषमता है, लेकिन Math.abs(Integer.MIN_VALUE)Integer.MIN_VALUE (जैसा -2147483648 में) देता है। आप मॉड्यूलस का पूर्ण मूल्य सुरक्षित रखते हैं, जैसे:

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