Потоковая передача Hadoop: один файл или несколько файлов на карту. Не разделять

У меня есть много zip-файлов, которые нужно обработать библиотекой C++. Поэтому я использую C++ для написания своей потоковой программы для Hadoop. Программа прочитает zip-файл, разархивирует его и обработает извлеченные данные. Моя проблема в том, что:

  1. мой картограф не может получить содержимое ровно одного файла. Обычно получается что-то вроде файлов 2.4 или 3.2. Hadoop отправит несколько файлов моему картографу, но по крайней мере один из файлов будет частичным. Вы знаете, что zip-файлы не могут быть обработаны таким образом. Могу ли я получить ровно один файл на карту? Я не хочу использовать список файлов в качестве входных данных и читать его из своей программы, потому что я хочу иметь преимущество локальности данных.

  2. Я могу принять содержимое нескольких zip-файлов на карту, если Hadoop не разбивает zip-файлы. Я имею в виду именно 1, 2, 3 файла, а не что-то вроде 2,3 файла. На самом деле это будет даже лучше, потому что моей программе нужно загрузить файл данных размером около 800 МБ для обработки разархивированных данных. Можем ли мы это сделать?


person avhacker    schedule 25.12.2012    source источник


Ответы (2)


Вы можете найти решение здесь:

http://wiki.apache.org/hadoop/FAQ#How_do_I_get_each_of_a_job.27s_maps_to_work_on_one_complete_input-file_and_not_allow_the_framework_to_split-up_the_files.3F

Самый простой способ, который я бы предложил, - установить mapred.min.split.size на большое значение, чтобы ваши файлы не разделялись.

Если это не сработает, вам нужно будет реализовать InputFormat, что не очень сложно сделать, и вы можете найти шаги по адресу: http://developer.yahoo.com/hadoop/tutorial/module5.html.#fileformat

person Varun Shingal    schedule 25.12.2012
comment
Если я установлю размер разделения на большое значение, я предполагаю, что мой картограф получит что-то вроде 100 файлов плюс часть 101-го файла. 101-й файл все еще разделен. Насколько я знаю, я не могу реализовать InputFormat для потоковой передачи Hadoop. Я прав? - person avhacker; 25.12.2012
comment
Затем вы можете использовать для своих целей следующее: gist.github.com/808035. Это customInputformat, который устанавливает для issplittable значение false. Также из: hadoop.apache.org/docs/r0.20.2/. По крайней мере, начиная с версии 0.14, Hadoop не поддерживает несколько файлов jar. Таким образом, при указании собственных пользовательских классов вам придется упаковать их вместе с потоковым jar-файлом и использовать пользовательский jar-файл вместо потокового jar-файла Hadoop по умолчанию. - person Varun Shingal; 26.12.2012

Вместо этого, в зависимости от минимального размера разделения, я бы предложил более простой способ — сжать ваши файлы с помощью Gzip.

Есть способ сжать файлы с помощью gzip.

http://www.gzip.org/

Если вы работаете в Linux, вы сжимаете извлеченные данные с помощью

gzip -r /path/to/data

Теперь, когда у вас есть это, передайте эти данные в качестве входных данных в задание потоковой передачи Hadoop.

person Karan Shah    schedule 22.11.2014
comment
Можете ли вы предоставить пример фрагмента кода с вашим ответом? - person MattSizzle; 22.11.2014
comment
Что это за более простой способ, можете ли вы объяснить это? - person Rama Kathare; 22.11.2014
comment
Этот комментарий должен работать, я думаю, потому что входной файл не будет разделен, если он сжат. Для потоковой передачи Hadoop предусмотрена возможность сжатия. - person Constantine; 09.03.2017