Запишите некоторые данные (строки) из моих картографов в отдельные каталоги в зависимости от некоторой логики в моем коде картографа.

Я использую mrjob для своих нужд EMR.

Как мне записать некоторые данные (строки) из моих картографов в «отдельные каталоги» в зависимости от некоторой логики в моем коде картографа, которую я могу:

  1. tar gzip и

  2. загружать в отдельные корзины S3 (в зависимости от имени каталога) после внезапного завершения/завершения задания?

Я предполагаю, что опции '--output-dir' позволяют вам загружать окончательный вывод задания только в этот каталог, но я хотел бы время от времени писать и в другие каталоги из моих картографов.


person newToFlume    schedule 18.06.2012    source источник


Ответы (3)


Нет, вы не можете в традиционном смысле этого слова.

Причина: MrJob внутренне использует потоковую передачу Hadoop для выполнения заданий сопоставления/уменьшения при работе с кластером Hadoop. Я предполагаю, что это то же самое для Amazon Elastic M/R, что и для кластера Hadoop.

--output-dir на самом деле является входом для потоковой передачи Hadoop, который указывает, где будут собираться выходные данные редукторов. Вы не можете использовать этот механизм для разделения данных по разным папкам.

[Изменить: в ответ на комментарий]

Насколько я понимаю, boto — это всего лишь библиотека для подключения к сервисам Amazon и доступа к ec2, s3 и т. д.

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

Я не проверял эту идею и не рекомендую этот подход. Это было бы похоже на открытие файла и запись в него непосредственно в редьюсерах. Теоретически вы могли бы это сделать. Вместо того, чтобы просто записывать вывод редуктора в std.out. Возможно, вы могли бы открывать и записывать объекты S3 напрямую. Вы должны убедиться, что вы будете открывать разные файлы, поскольку они порождают несколько редукторов.

Вот что я узнал, используя MrJob с кластером Hadoop: http://pyfunc.blogspot.com/2012/05/hadoop-map-reduce-with-mrjob.html

person pyfunc    schedule 18.06.2012
comment
Думая глубже: MrJob поставляется с определенной версией boto. Теперь я могу использовать это для записи в локальную папку или, если это не удастся, в удаленную корзину S3? - person newToFlume; 19.06.2012
comment
Я все еще ищу способ уменьшить количество PUT до S3 (сейчас я запускаю как минимум один PUT для каждой другой строки, которую я получаю) - person newToFlume; 19.06.2012
comment
Кроме того, куда попадают данные, записанные в STDERR, для MrJob? (Я предполагаю, что весь вывод STDOUT идет в место, на которое указывает '--output-dir') - person newToFlume; 19.06.2012
comment
@newToFlume: оба файла журнала. См. раздел hadoop.apache.org/common/docs/r0.17.0. / - person pyfunc; 19.06.2012
comment
Эта ссылка не кажется полезной для потоковой передачи Hadoop, но спасибо Ashish за продолжение. - person newToFlume; 19.06.2012

Я думаю, что функция Hadoop MultipleOutput может вам помочь, в вашем пользовательском outputFormat вы можете указать путь и имя файла.

person Chun    schedule 19.06.2012
comment
Я думаю, что в настоящее время вы не можете делать это в потоковой передаче Hadoop, hadoop.apache.org/common/docs/r0.20.2/ говорит, что вы должны использовать пользовательский jar. Но я могу ошибаться - person Chun; 20.06.2012
comment
Вы, безусловно, можете запустить пользовательский jar-файл как потоковое задание Hadoop. Пример команды должен выглядеть так: -path› --step-name Шаг моей потоковой работы - person Amar; 20.06.2012

Вы можете следовать подходу создания пользовательского Jar и настроить свой OutputFormat, чтобы объединить выходные данные в разных папках/файлах. Вы должны создать подкласс MultipleTextOutputFormat и переопределить несколько методов в нем (в основном generateFileNameForKeyValue(Text key, Text value, String leaf) и generateActualKey(Text key, Text value)).

Подробнее см. здесь: http://www.infoq.com/articles/HadoopOutputFormat.

person Amar    schedule 19.06.2012