Seth
Seth

Reputation: 5740

hadoop exception instantiating OutputKey

I'm getting an exception when I try to use my own key in a map reduce job. It can't seem to find the default constructor for my key, even though I've specified it. I found a related question (No such method exception Hadoop <init>), but the solution doesn't really help me very much.

(Note: I'm using hadoop 2.2.0.)

The exception:

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

The key class:

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);
    }
}

Thanks for the help!

Upvotes: 1

Views: 473

Answers (1)

Seth
Seth

Reputation: 5740

I found the problem. It wasn't a hadoop issue, it was some API confusion on my part about a proprietary library.

Upvotes: 1

Related Questions