Hadoop создает исключение ClassCastException для типа ключа java.nio.ByteBuffer - PullRequest
5 голосов
/ 13 января 2012

Я использую "hadoop-0.20.203.0rc1.tar.gz" для настройки моего кластера.Всякий раз, когда я устанавливаю job.setMapOutputKeyClass(ByteBuffer.class);

и запускаю задание, я получаю следующее исключение:

    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)

Также я заметил, что ByteBuffer является сопоставимым и не записываемым.Дайте мне знать, если потребуется дополнительная информация.

1 Ответ

5 голосов
/ 13 января 2012

Это где исключение. Вот код из 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));
}

Если свойство mapred.output.key.comparator.class не определено в JobConf, то ключ должен реализовывать интерфейс WritableComparable. Класс ByteBuffer не реализует интерфейс WritableComparable, поэтому исключение.

Кстати, Интерфейс WritableComparable является подчиненным интерфейсом классов Writable и Comparable.

...