Hadoop löst ClassCastException für den Keytype von Java.nio.ByTebuffer aus
-
28-10-2019 - |
Frage
Ich verwende "Hadoop-0.20.203.0RC1.tar.gz" für mein Cluster-Setup. Wann immer ich setze job.setMapOutputKeyClass(ByteBuffer.class);
Und führen Sie den Job aus, den ich folgt: Ausnahme:
12/01/13 15:09:00 INFO mapred.JobClient: Task Id : attempt_201201131428_0005_m_000001_2, Status : FAILED
java.lang.ClassCastException: class java.nio.ByteBuffer
at java.lang.Class.asSubclass(Class.java:3018)
at org.apache.hadoop.mapred.JobConf.getOutputKeyComparator(JobConf.java:776)
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:958)
at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:673)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:755)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:369)
at org.apache.hadoop.mapred.Child$4.run(Child.java:259)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059)
at org.apache.hadoop.mapred.Child.main(Child.java:253)
Außerdem habe ich bemerkt, dass ByteBuffer vergleichbar und nicht beschreibbar ist, ist, dass dies Unterschied macht? Lassen Sie mich wissen, ob zusätzliche Informationen erforderlich sind.
Lösung
Hier wird die Ausnahme ausgelöst. Hier ist der Code von SVN.
public RawComparator getOutputKeyComparator() {
Class<? extends RawComparator> theClass = getClass("mapred.output.key.comparator.class",
null, RawComparator.class);
if (theClass != null)
return ReflectionUtils.newInstance(theClass, this);
return WritableComparator.get(getMapOutputKeyClass().asSubclass(WritableComparable.class));
}
Wenn mapred.output.key.comparator.class
Die Eigenschaft ist nicht auf JobConf definiert, dann muss der Schlüssel die writeLableCompable -Schnittstelle implementieren. Die ByteBuffer -Klasse implementiert die writeLableCompable -Schnittstelle nicht, daher die Ausnahme.
Übrigens, Writable komparabel Die Schnittstelle ist die Untergrenze von beschreibbaren und vergleichbaren Klassen.