Java hadoop异常实例化OutputKey

Java hadoop异常实例化OutputKey,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,当我尝试在map reduce作业中使用自己的密钥时,我遇到了一个异常。它似乎找不到我的密钥的默认构造函数,即使我已经指定了它。我发现了一个相关的问题(),但解决方案对我帮助不大 (注意:我使用的是hadoop 2.2.0。) 例外情况: java.lang.Exception: java.lang.RuntimeException: java.lang.NoSuchMethodException: org.apache.hadoop.io.WritableComparable.<init

当我尝试在map reduce作业中使用自己的密钥时,我遇到了一个异常。它似乎找不到我的密钥的默认构造函数,即使我已经指定了它。我发现了一个相关的问题(),但解决方案对我帮助不大

(注意:我使用的是hadoop 2.2.0。)

例外情况:

java.lang.Exception: java.lang.RuntimeException: java.lang.NoSuchMethodException: org.apache.hadoop.io.WritableComparable.<init>()
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:403)
Caused by: java.lang.RuntimeException: java.lang.NoSuchMethodException: org.apache.hadoop.io.WritableComparable.<init>()
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:131)
    at org.apache.hadoop.io.WritableComparator.newKey(WritableComparator.java:115)
    at org.apache.hadoop.io.WritableComparator.<init>(WritableComparator.java:101)
    at org.apache.hadoop.io.WritableComparator.get(WritableComparator.java:55)
    at org.apache.hadoop.mapred.JobConf.getOutputKeyComparator(JobConf.java:885)
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.init(MapTask.java:982)
    at org.apache.hadoop.mapred.MapTask.createSortingCollector(MapTask.java:390)
    at org.apache.hadoop.mapred.MapTask.access$100(MapTask.java:79)
    at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:674)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:746)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:339)
    at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:235)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.NoSuchMethodException: org.apache.hadoop.io.WritableComparable.<init>()
    at java.lang.Class.getConstructor0(Class.java:2810)
    at java.lang.Class.getDeclaredConstructor(Class.java:2053)
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:125)
    ... 16 more
java.lang.Exception:java.lang.RuntimeException:java.lang.NoSuchMethodException:org.apache.hadoop.io.WritableCompariable.()
位于org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:403)
原因:java.lang.RuntimeException:java.lang.NoSuchMethodException:org.apache.hadoop.io.WritableCompariable。()
位于org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:131)
位于org.apache.hadoop.io.WritableComparator.newKey(WritableComparator.java:115)
位于org.apache.hadoop.io.WritableComparator。(WritableComparator.java:101)
位于org.apache.hadoop.io.WritableComparator.get(WritableComparator.java:55)
位于org.apache.hadoop.mapred.JobConf.getOutputKeyComparator(JobConf.java:885)
位于org.apache.hadoop.mapred.MapTask$mapoutbuffer.init(MapTask.java:982)
位于org.apache.hadoop.mapred.MapTask.createSortingCollector(MapTask.java:390)
位于org.apache.hadoop.mapred.MapTask.access$100(MapTask.java:79)
位于org.apache.hadoop.mapred.MapTask$NewOutputCollector。(MapTask.java:674)
位于org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:746)
位于org.apache.hadoop.mapred.MapTask.run(MapTask.java:339)
位于org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:235)
位于java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
在java.util.concurrent.FutureTask.run(FutureTask.java:262)处
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
运行(Thread.java:744)
原因:java.lang.NoSuchMethodException:org.apache.hadoop.io.WritableComparable。()
位于java.lang.Class.getConstructor0(Class.java:2810)
位于java.lang.Class.getDeclaredConstructor(Class.java:2053)
位于org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:125)
... 还有16个
关键类:

import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableComparable;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.UUID;

public class WritableUUID
    implements Writable, Cloneable, WritableComparable<WritableUUID> {

    private UUID uuid;

    public WritableUUID() {

    }

    public WritableUUID(UUID uuid) {
        this.uuid = uuid;
    }

    public UUID getUuid() {
        return uuid;
    }

    @Override
    public int compareTo(WritableUUID o) {
        return uuid.compareTo(o.uuid);
    }

    @Override
    public void write(DataOutput dataOutput) throws IOException {
        dataOutput.writeLong(uuid.getLeastSignificantBits());
        dataOutput.writeLong(uuid.getMostSignificantBits());
    }

    @Override
    public void readFields(DataInput dataInput) throws IOException {
        long lsb = dataInput.readLong();
        long msb = dataInput.readLong();

        this.uuid = new UUID(msb, lsb);
    }
}
import org.apache.hadoop.io.writeable;
导入org.apache.hadoop.io.WritableComparable;
导入java.io.DataInput;
导入java.io.DataOutput;
导入java.io.IOException;
导入java.util.UUID;
公共类可写UUID
实现可写、可克隆、可写和可比较{
私有UUID-UUID;
公共可写UUID(){
}
公共可写UUID(UUID UUID){
this.uuid=uuid;
}
公共UUID getUuid(){
返回uuid;
}
@凌驾
公共int比较对象(可写UUID o){
返回uuid.compareTo(o.uuid);
}
@凌驾
公共无效写入(DataOutput DataOutput)引发IOException{
writeLong(uuid.getLeastSignificantBits());
writeLong(uuid.getMostSignificantBits());
}
@凌驾
公共void读取字段(DataInput DataInput)引发IOException{
long lsb=dataInput.readLong();
long msb=dataInput.readLong();
this.uuid=新的uuid(msb,lsb);
}
}

谢谢你的帮助

我发现了问题。这不是hadoop的问题,而是我对专有库的一些API混淆。

您的无参数构造函数是否应该为uuid设置值?我不知道这是否就是问题所在。事实上,这似乎是您链接到的问题的可接受答案下的注释。@mohit6up这不会影响问题。空构造函数在任何情况下都是不完整的,afaict。您是否在工作中设置了MapOutputKeyClass?也许你也可以在这里发布你的工作?