2012-01-13 4 views
5

クラスタ設定に「hadoop-0.20.203.0rc1.tar.gz」を使用しています。 私は例外次取得job.setMapOutputKeyClass(ByteBuffer.class);Hadoop Throws java.nio.ByteBufferのkeytypeのClassCastException

を設定し、ジョブを実行するたびに:

また
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のが同等であることに気づいたと書き込み可能なことは、任意のdiffrenceを作るされていませんか? 追加情報が必要な場合はお知らせください。

答えて

5

例外がスローされる場所です。ここにはSVNのcodeがあります。

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インターフェイスを実装していないため、例外です。

BTW、WritableComparableインターフェイスは、書き込み可能クラスと比較可能クラスのサブインターフェイスです。

+0

これをByteBufferに設定する方法を詳しく説明できれば助かります。 – samarth

+0

@samarthバイト配列をorg.apache.hadoop.io.BytesWritableにラップすることができます –