2014-12-02 2 views
1

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

Этот редуктор заданий предполагает название типа (как правило, любое название объекта) и тип ссылки на объект. Форма записи является: 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», и я установил разделитель ключевых полей на «%». Он должен разделять данные на идентификатор объекта, например. «common.topic» или «m.01dyhm». Но я думаю, что моя конфигурация неверна. Он работает с одним редуктором (Hortonworks VM), но испускает пустые файлы на 32 узловых кластерах (у меня нет прямого доступа, поэтому я не могу эффективно экспериментировать). Я думаю, что разметка неверна и нет данных для соединения на одном редукторе.

Это моя команда Hadoop:

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 

Является ли моя конфигурация разметки не так ли? Спасибо за любую помощь.

ответ

1

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

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

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

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

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

+0

Спасибо, я попробую этот вариант. Я вообще ничего не получаю. Код Python прав, он работает с одним редуктором, когда данные правильно отсортированы. –

+0

Если вы разместите код карты/редуктора, я могу попробовать запустить его в своем кластере на приведенных примерах данных и посмотреть, что я получу. – Nonnib

+0

Мой учитель не отвечает, поэтому я не знаю, помогает ли этот вариант. Не могли бы вы попробовать его в своем кластере? К сожалению, у меня нет подмножества набора данных, содержащего достаточно релевантных данных. На кластере 32 узлов он должен работать менее часа. [Набор данных Freebase Triples] (https://developers.google.com/freebase/data). [Код] (https://github.com/OndroNR/freebase/tree/odovzdanie/python/src/mr_extractor_avro). Дайте мне знать, если вам нужно что-то разъяснить. Большое спасибо. –

Смежные вопросы