Я извлекаю данные из дампа 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
Правильно ли настроен мой разделитель? Спасибо за любую помощь.