Вторичная сортировка в Hadoop

Я работаю над проектом Hadoop, и после многих посещений различных блогов и чтения документации я понял, что мне нужно использовать функцию вторичной сортировки, предоставляемую инфраструктурой Hadoop.

Мой формат ввода имеет вид:

DESC(String) Price(Integer) and some other Text

Я хочу, чтобы значения в редукторе были в порядке убывания цены. Также при сравнении DESC у меня есть метод, который принимает две строки и процентное значение, и если сходство между двумя строками равно или превышает процент, я должен считать их равными.

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

Вот мой метод compareTo составного ключа

public int compareTo(VendorKey o) {
    int result =-
    result = compare(token, o.token, ":") >= percentage ? 0:1;
    if (result == 0) {
        return pid> o.pid  ?-1: pid < o.pid ?1:0;
    }
    return result;
}

и сравните метод компаратора группировки

public int compare(WritableComparable a, WritableComparable b) {
    VendorKey one = (VendorKey) a;
    VendorKey two = (VendorKey) b;
    int result = ClusterUtil.compare(one.getToken(), two.getToken(), ":") >= one.getPercentage() ? 0 : 1;
    // if (result != 0)
    // return two.getToken().compareTo(one.getToken());
    return result;
}

person Abhishek Singh    schedule 04.08.2016    source источник
comment
Сработало ли исправление метода compareTo для вас?   -  person aventurin    schedule 15.08.2016


Ответы (3)


Кажется, что ваш метод compareTo нарушает общепринятое контракт, который требует, чтобы sgn(x.compareTo(y)) было равно -sgn(y.compareTo(x)).

person aventurin    schedule 06.08.2016

После вашего customWritable укажите один базовый разделитель с составным ключом и значением NullWritable. Например:

public class SecondarySortBasicPartitioner extends
    Partitioner<CompositeKeyWritable, NullWritable> {

    public int getPartition(CompositeKeyWritable key, NullWritable value,
            int numReduceTasks) {

        return (key.DEPT().hashCode() % numReduceTasks);
    }
}

И после этого укажите компаратор сортировки по ключу, и с 2 переменными CompositeKeyWritable будет выполнена группировка.

person Sandeep Dabhade    schedule 22.04.2017

Во время перемешивания есть 3 процедуры: Разбиение, Сортировка и группировка. Я предполагаю, что у вас есть несколько редьюсеров, и ваши похожие результаты обрабатывались разными редукторами, потому что они находятся в разных разделах.

Вы можете установить количество редукторов равным 1 или установить собственный разделитель, который расширяет org.apache.hadoop.mapreduce.Partitioner для вашей работы.

person Harper    schedule 10.01.2018