У меня небольшая проблема с заданием 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 меньше)?