Вторичная сортировка Hadoop (setPartitioner против setOutputValueGroupingComparator) - PullRequest
1 голос
/ 09 февраля 2012

Я пытаюсь отказаться от необходимости использования метода setOutputValueGroupingComparator для вторичной сортировки - разве setPartitioner не будет достаточно?

Скажите, что мои входные файлы имеют следующие поля: customerId, orderId, orderDate, orderAmount

Ожидаемый результат - последний заказ для каждого клиента

Я настроил ключевой компаратор, используя setOutputKeyComparatorClass (), который будет сравнивать по customerId asc, orderDate desc

И разделитель, использующий setPartitioner (), который разделит на customerId% numPartition

Вот примеры ключей, которые будут отправлены, если число редукторов равно 2:

key1: { customerId : 1, orderDate : 2012-01-31 } => reducer 1
key2: { customerId : 1, orderDate : 2011-12-31 } => reducer 1    
key3: { customerId : 2, orderDate : 2011-12-01 } => reducer 2    
key4: { customerId : 3, orderDate : 2012-02-01 } => reducer 1

Мои вопросы:

a) Имеется ли вышеупомянутый разделитель, возможно ли отправлять ключи редуктору 1 в следующем (неправильном) порядке? Здесь клиент 3 перемежается с клиентом 1

key1: { customerId : 1, orderDate : 2012-01-31 } => reducer 1
key4: { customerId : 3, orderDate : 2012-02-01 } => reducer 1
key2: { customerId : 1, orderDate : 2011-12-31 } => reducer 1

b) Если да, то установит ли setOutputValueGroupingComparator (который сравнивает customerId в ключе) это и отправит его в правильном порядке редуктору?

key1: { customerId : 1, orderDate : 2012-01-31 } => reducer 1
key2: { customerId : 1, orderDate : 2011-12-31 } => reducer 1
key4: { customerId : 3, orderDate : 2012-02-01 } => reducer 1

Спасибо

Аджай

1 Ответ

2 голосов
/ 09 февраля 2012

Прежде всего, прочитайте это: http://hadoop.apache.org/common/docs/r0.20.2/mapred_tutorial.html

Секционер решает, какие ключи идут на какие редукторы. Таким образом, если у вас есть клавиши A, B, C и D и редукторы 1 и 2, то разделитель решает, что выходы A и C (например) идут на редуктор 1, а B и D - на редуктор 2.

OutputKeyComparatorClass определяет, сортируются ли и как данные для разных строк с одинаковым ключом до того, как они уменьшены. Только случайная фаза группирует Карта, выводимая по ключу - это не гарантирует, что данные отсортированы .

В вашем случае похоже, что вы выбираете не тот ключ. Я думаю, что ваш ключ должен быть {customerId, orderDate}, и вы должны использовать getOutputValueGroupingComparator для сравнения ключей по customerId только для группировки, а setOutputKeyComparatorClass для сравнения ключей по customerId и orderDate по убыванию для ввода в редуктор. См. Также электронное письмо Оуэна О'Мэлли здесь на ту же тему: http://www.mail-archive.com/core-user@hadoop.apache.org/msg05677.html

...