Потоковая передача Hadoop KeyFieldBasedPartitioner

Я извлекаю данные из дампа freebase (название, псевдонимы, имена типов) в avro (еще не в этой работе). Я использую потоковую передачу mapreduce с python.

Этот редуктор заданий ожидает заголовок типа (который обычно является заголовком любого объекта) и ссылку идентификатора типа на объект. Форма записи: id%relation\tvalue

Например:

common.topic%title  Topic
common.topic%used_by    m.01dyhm
common.topic%used_by    m.03x5qm
common.topic%used_by    m.04pm6

Редуктор излучает:

m.01dyhm%type   Topic
m.03x5qm%type   Topic
m.04pm6%type    Topic

Заголовок предшествует ссылкам (поэтому редьюсер запоминает его и выдает разыменованные записи), а все записи, относящиеся к одному типу, должны быть разделены на один редьюсер. Это обеспечивается сортировкой ключей. Поскольку я использую составной ключ, мне нужно правильно разделить записи. Я использую KeyFieldBasedPartitioner с конфигурацией «-k1,1» и устанавливаю разделитель ключевых полей на «%». Он должен разделять данные по идентификатору объекта, например. "общая.тема" или "м.01дыхм". Но я думаю, что моя конфигурация неверна. Он работает с одним редюсером (Hortonworks VM), но выдает пустые файлы в кластере из 32 узлов (к которому у меня нет прямого доступа, поэтому я не могу эффективно экспериментировать). Я предполагаю, что разделение неправильно, и нет данных для объединения на одном редукторе.

Это моя команда хаупа:

hadoop \
jar $streaming \
-D mapred.job.name='Freebase extract - phase 3' \
-D mapreduce.map.output.key.field.separator='%' \
-D mapreduce.partition.keypartitioner.options=-k1,1 \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
-input freebase/job1output \
-input freebase/job2output \
-output freebase/job3output \
-mapper "python job3mapper.py" \
-reducer "python job3reducer.py" \
-file job3mapper.py \
-file job3reducer.py 

Правильно ли настроен мой разделитель? Спасибо за любую помощь.


person Ondrej Galbavý    schedule 02.12.2014    source источник


Ответы (1)


Это выглядит хорошо для меня. Вы разделяете ключ на два подраздела и используете первую часть для разделения.

Возможно, вы захотите добавить следующую опцию, чтобы сообщить разделителю, что вы хотите сортировать по составному ключу, чтобы ваши входные данные редуктора были отсортированы.

-D stream.num.map.output.key.fields=2

Если вы получаете пустые строки в своем выводе, это указывает на то, что вы пишете дополнительные переводы строки. Строки передаются через sys.stdin с завершающим \n. Вы можете попробовать использовать print line или print line.strip() в ваших мапперах и редьюсерах, чтобы увидеть, так ли это.

Если вы вообще не получаете вывода, проблема может быть в коде Python.

person Nonnib    schedule 03.12.2014
comment
Спасибо, попробую этот вариант. У меня вообще не выходит. Код Python правильный, он работает с одним редьюсером, когда данные правильно отсортированы. - person Ondrej Galbavý; 04.12.2014
comment
Если вы опубликуете свой код преобразователя/редуктора, я могу попробовать запустить его в своем кластере на предоставленных примерных данных и посмотреть, что я получу. - person Nonnib; 04.12.2014
comment
Мой учитель не отвечает, поэтому я не знаю, поможет ли этот вариант. Не могли бы вы попробовать это на своем кластере? К сожалению, у меня нет подмножества набора данных, содержащего достаточно релевантных данных. В кластере из 32 узлов он должен работать менее часа. набор данных Freebase Triples. Код. Дайте мне знать, если вам нужно что-то уточнить. Большое спасибо. - person Ondrej Galbavý; 28.12.2014