Mapreduce разные ключи выдают разное количество сообщений - PullRequest
0 голосов
/ 30 ноября 2018

У меня небольшая проблема с заданием mapreduce, имеющим разное количество сообщений, если я использую два разных класса для Ключа.Проблема в том, что классы должны быть по существу одинаковыми в отношении Mapreduce.

Случай 1:

class Key1{
    private LongWritable id = new LongWritable();
    private LongWritable timestamp = new LongWritable();
}

С этим классом Key задание MR выдает 9871431 результатов

Случай 2:

class Key1{
    private LongWritable id = new LongWritable();
    private LongWritable timestamp = new LongWritable();
    private LongWritable field1 = new LongWritable();
    .....
    private LongWritable fieldN = new LongWritable();
}

Разница только в том, что Ключ имеет больше полей.Пока можно объяснить разные результаты, НО: Мой компаратор группировки использует только поле идентификатора

public class NaturalKeyGroupingComparator extends WritableComparator {

    protected NaturalKeyGroupingComparator() {
        super(Key1.class, true);
    }
    @SuppressWarnings("rawtypes")
    public int compare(WritableComparable a, WritableComparable b) {
        Key1 p1 = (Key) a;
        Key p2 = (Key) b;

        return p1.getId().compareTo(p2.getId());
    }
}

То же самое с моим разделителем

public class MMSIPairPartitioner extends Partitioner<Key1, TrackingPair> {

    public int getPartition(Key1 key, TrackingPair value, int numPartitions) {
        return key.getId().hashCode() % numPartitions;
    }
}

Так что я думаю, что я могуиспользование Key1 должно привести к тому же количеству документов, что и поля, используемые при определении раздела, одинаковы для Key1 и Key2.

Хотя Key1, produces 2 documents less.

Редукционная частьто же самое для обоих случаев.

Обе реализации Key имеют этот метод сравнения, поскольку я использую вторичную сортировку

public int compareTo(Key pair) {
        int compareValue = this.id.compareTo(pair.getId());
        if (compareValue == 0) {
            compareValue = this.timestamp.compareTo(pair.getTimestamp());
        }
        return compareValue;
    }

Так почему бы классу Key с большим количеством полей (но не использованным для сортировки или разбиения) выдаст различное количество результатов (в данном случае на 2 меньше)?

...