потоковая передача hadoop, обеспечивающая один ключ на редуктор - PullRequest
3 голосов
/ 15 сентября 2011

У меня есть маппер, который при обработке данных классифицирует вывод на 3 разных типа (тип - это ключ вывода).Моя цель - создать 3 разных файла CSV через редукторы, каждый со всеми данными для одного ключа со строкой заголовка.

Значения ключа могут изменяться и являются текстовыми строками.

Теперьв идеале мне бы хотелось иметь 3 разных редуктора, и каждый редуктор получал бы только один ключ со своим полным списком значений.

За исключением того, что, похоже, это не работает, потому что ключи не отображаются наконкретные редукторы.

Ответ на этот вопрос в других местах заключался в том, чтобы написать собственный класс разделителя, который бы сопоставлял каждое желаемое значение ключа с конкретным редуктором.Это было бы здорово, за исключением того, что мне нужно использовать потоковую передачу с python, и я не могу включить в свою работу пользовательский потоковый файл jar, так что это, кажется, не вариант.

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

Любые предложения приветствуются.

Примеры :

mapper output:

csv2 \ tfieldA, fieldB, fieldC csv1 \ tfield1, field2, field3, field4 csv3 \ tfieldRed, fieldGreen ...

проблема состоит в том, что, если у меня есть 3 редуктора, я получаю распределение ключейвот так:

reducer1        reducer2        recuder3
csv1            csv2
csv3

один редуктор получает два разных типа ключей, а один редуктор вообще не получает никаких данных.это потому, что хэш (ключ csv1) mod 3 и хэш (ключ csv2) mod 3 приводят к одному и тому же значению.

Ответы [ 3 ]

1 голос
/ 20 сентября 2011

Если вы хотите настраивать вывод в разные CSV-файлы, вы можете направить запись (с помощью API) в hdfs. Как вы знаете, hadoop передает ключ и связанный список значений в одну задачу сокращения. В сокращенном коде отметьте, в то время как ключ один и тот же, и запись в тот же файл. Если появится другой ключ, создайте новый файл вручную и запишите в него. Неважно, сколько у вас редукторов

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

Я почти уверен, что MultipleOutputFormat [1] можно использовать при потоковой передаче.Это решит большинство ваших проблем.

http://hadoop.apache.org/common/docs/r0.20.1/api/org/apache/hadoop/mapred/lib/MultipleOutputFormat.html

1 голос
/ 18 сентября 2011

Если вы застряли с потоковой передачей и не можете включить какие-либо внешние jar-файлы для пользовательского разделителя, то, вероятно, это не сработает так, как вы хотите, без некоторых хаков.

Если этоабсолютные требования, вы можете обойти это, но это грязно.

Вот что вы можете сделать:

Hadoop по умолчанию использует разделитель хэширования, например так:

key.hashCode() % numReducers

Таким образом, вы можете выбрать ключи так, чтобы они хэшировали до 1, 2 и 3 (или три числа, такие как x % 3 = 1, 2, 3).Это неприятный хак, и я бы не советовал, если у вас нет других вариантов.

...