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

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

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

  1. тар гзип и

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

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

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

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

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

Для получения более подробной информации вы можете обратиться к этому: http://www.infoq.com/articles/HadoopOutputFormat

Другие вопросы по тегам