разделение файла hadoop с использованием KeyFieldBasedPartitioner

У меня есть большой файл, который отформатирован следующим образом

sample name \t index \t score

И я пытаюсь разделить этот файл на основе имени примера с помощью Hadoop Streaming. Я заранее знаю, сколько есть сэмплов, поэтому могу указать, сколько редукторов мне нужно. Этот post делает что-то очень похожее, поэтому я знаю, что это возможно.

Я попытался использовать следующий скрипт, чтобы разбить этот файл на 16 файлов (есть 16 образцов)

hadoop jar $STREAMING \
    -D mapred.text.key.partitioner.options=-k1,1 \
    -D stream.num.map.output.key.fields=2 \
    -D mapred.reduce.tasks=16 \
    -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
    -mapper cat \
    -reducer org.apache.hadoop.mapred.lib.IdentityReducer \
    -input input_dir/*part* -output output_dir

Это отчасти работает — некоторые файлы содержат только одно имя примера. Однако большинство файлов part* пусты, а некоторые файлы part* содержат несколько названий образцов.

Есть ли лучший способ убедиться, что каждый редуктор получает только одно имя образца?


person mortonjt    schedule 25.06.2013    source источник


Ответы (1)


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

Эта ссылка описывает, как сделать это действительно хорошо. В итоге я приспособил эту другую ссылку для своего конкретного приложения. В целом, это всего лишь несколько дополнительных строк Java

person mortonjt    schedule 03.07.2013