Редуктор Hadoop 0.20.2 генерирует исключение ArrayIndexOutOfBoundsException при итерации значений - PullRequest
1 голос
/ 01 октября 2011

Я довольно новичок в hadoop, однако я читаю "Hadoop: полное руководство", поэтому я думаю, что у меня есть понимание основных концепций.

Я использовал Hadoop 0.20.2 для выполнения довольно простой работы, но получаю следующее исключение:

java.lang.ArrayIndexOutOfBoundsException: 4096
        at java.io.ByteArrayInputStream.read(ByteArrayInputStream.java:127)
        at java.io.DataInputStream.readInt(DataInputStream.java:373)
        at com.convertro.mapreduce.WritableHit.readFields(Unknown Source)
        at org.apache.hadoop.io.serializer.WritableSerialization$WritableDeseria
lizer.deserialize(WritableSerialization.java:67)
        at org.apache.hadoop.io.serializer.WritableSerialization$WritableDeseria
lizer.deserialize(WritableSerialization.java:40)
        at org.apache.hadoop.mapreduce.ReduceContext.nextKeyValue(ReduceContext.
java:116)
        at org.apache.hadoop.mapreduce.ReduceContext$ValueIterator.next(ReduceCo
ntext.java:163)
        at com.convertro.mapreduce.HitConvertingIterable$HitConvertingIterator.n
ext(HitConvertingIterable.java:35)
        at com.convertro.mapreduce.HitConvertingIterable$HitConvertingIterator.n
ext(HitConvertingIterable.java:1)
        at com.convertro.naive.NaiveHitReducer.reduce(Unknown Source)
        at com.convertro.mapreduce.HitReducer.reduce(Unknown Source)
        at com.convertro.mapreduce.HitReducer.reduce(Unknown Source)
        at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:176)
        at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:566
)
        at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:408)
        at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:2

Это происходит во время чтения класса WritableHit (входное значение для фазы сокращения). Ниже приведен код класса WritableHit:

 public class WritableHit implements WritableComparable<WritableHit> {

    private Hit hit;

    public WritableHit() {
        this(null);
    }

    public WritableHit(Hit hit) {
        this.hit = hit;
    }

    @Override
    public void readFields(DataInput input) throws IOException {
        String clientName = input.readUTF();
        String clientSiteId = input.readUTF();
        String eventUniqueId = input.readUTF();
        String eventValue = input.readUTF();
        String pageRequested = input.readUTF();
        String refererUrl = input.readUTF();
        String uniqueHitId = input.readUTF();
        String userAgent = input.readUTF();
        String userIdentifier = input.readUTF();
        String userIp = input.readUTF();
        int timestamp = input.readInt();
        int version = input.readInt();

        hit = new Hit(version, uniqueHitId, clientName, clientSiteId, timestamp, userIdentifier, 
                userIp, pageRequested, refererUrl, userAgent, eventUniqueId, eventValue);
    }

    @Override
    public void write(DataOutput output) throws IOException {
        output.writeUTF(hit.getClientName());
        output.writeUTF(hit.getClientSiteId());
        output.writeUTF(hit.getEventUniqueId());
        output.writeUTF(hit.getEventValue());
        output.writeUTF(hit.getPageRequested());
        output.writeUTF(hit.getRefererUrl());
        output.writeUTF(hit.getUniqueHitId());
        output.writeUTF(hit.getUserAgent());
        output.writeUTF(hit.getUserIdentifier());
        output.writeUTF(hit.getUserIp());
        output.write(hit.getTimestamp());
        output.write(hit.getVersion());
    }

    public Hit getHit() {
        return hit;
    }

    @Override
    public int compareTo(WritableHit o) {
        return hit.getUniqueHitId().compareTo(o.getHit().getUniqueHitId());
    }
    }

Любая помощь будет высоко ценится.

Спасибо

1 Ответ

1 голос
/ 02 октября 2011

Я понял это.

Очевидно, что при реализации объекта с возможностью записи следует использовать метод writeInt , а не метод write .

Как только я это сделал, это сработало как шарм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...