Hadoop MultipleOutputFormats в HFileOutputFormat и TextOutputFormat

Я запускаю задание ETL с Hadoop, где мне нужно вывести действительные, преобразованные данные в HBase и внешний индекс для этих данных в MySQL. Моя первоначальная мысль заключалась в том, что я мог бы использовать MultipleOutputFormats для экспорта преобразованных данных с помощью HFileOutputFormat (ключ — это текст, а значение — ProtobufWritable) и индекс для TextOutputFormat (ключ — это текст, а значение — текст).

Количество входных записей для задания среднего размера (мне понадобится возможность запуска многих одновременно) составляет около 700 миллионов.

Мне интересно, а) кажется ли это разумным подходом с точки зрения эффективности и сложности, и Б) как это сделать с помощью API дистрибутива CDH3, если это возможно.


person ja87    schedule 25.02.2012    source источник


Ответы (1)


Если вы используете старый API MapReduce, вы можете использовать MultipleOutputs и записывать в несколько выходных форматов.

Однако, если вы используете новый API MapReduce, я не уверен, что есть способ сделать то, что вы пытаетесь сделать. Возможно, вам придется заплатить цену за выполнение другого задания MapReduce на тех же входных данных. Но мне придется провести больше исследований, прежде чем сказать наверняка. Может быть способ взломать старый + новый API вместе, чтобы вы могли использовать MultipleOutputs с новым API.

EDIT: взгляните на этот сообщение. Вероятно, вы можете реализовать свой собственный OutputFormat и оберните соответствующий RecordWriters в OutputFormat и используйте его для записи в несколько выходных форматов.

person Pradeep Gollakota    schedule 26.02.2012
comment
Я использую CDH3u3, у которого есть MultipleOutputs. Я попробую это. Считаете ли вы, что общий подход будет эффективным? Любые другие предложения? Очевидно, я бы предпочел не запускать вторую работу, поскольку у меня уже есть все данные, которые я хочу, в ОЗУ в редюсере. - person ja87; 27.02.2012
comment
Я лично не использовал MultipleOutputs, но подозреваю, что это будет довольно эффективно. По крайней мере, более эффективно, чем выполнение второго задания MR. Мое предложение с этим подходом состоит в том, чтобы следить за своими разливами. В то время как вы повышаете производительность, не выполняя второе сканирование своих данных, вы удваиваете результат своей работы, что, вероятно, приведет к удвоению ваших разливов. Я бы провел эксперимент с запуском задания с MultipleOutputs, а также запуском задания как двух отдельных заданий, чтобы увидеть, какое из них более производительно. - person Pradeep Gollakota; 27.02.2012