Обработка большого набора маленьких файлов с Hadoop - PullRequest
6 голосов
/ 09 мая 2011

Я использую пример программы WordCount для Hadoop для обработки большого набора небольших файлов / веб-страниц (около 2-3 кБ).Так как это далеко от оптимального размера файла для файлов hadoop, программа работает очень медленно.Я предполагаю, что это потому, что стоимость установки и разрыва работы намного выше, чем сама работа.Такие небольшие файлы также вызывают истощение пространств имен для имен файлов.

Я прочитал, что в этом случае я должен использовать архив HDFS (HAR), но я не уверен, как изменить эту программу WordCount для чтения из этого архива.Может ли программа продолжать работать без изменений или необходима какая-то модификация?

Даже если я упакую много файлов в архивы, остается вопрос, улучшит ли это производительность.Я прочитал, что даже если я упакую несколько файлов, эти файлы внутри одного архива будут обрабатываться не одним картографом, а многими, что в моем случае (я полагаю) не улучшит производительность.вопрос слишком простой, пожалуйста, поймите, что я новичок в Hadoop и у меня очень мало опыта с ним.

Ответы [ 5 ]

4 голосов
/ 09 мая 2011

Использование HDFS не изменит того, что вы заставляете hadoop обрабатывать большое количество маленьких файлов. Наилучшим вариантом в этом случае, вероятно, является cat файлов в один (или несколько больших) файлов. Это уменьшит количество картографов, которые у вас есть, и уменьшит количество вещей, которые необходимо обработать.

Использование HDFS может повысить производительность, если вы работаете в распределенной системе. Если вы используете только псевдо-дистрибутив (один компьютер), то HDFS не собирается улучшать производительность. Ограничение - машина.

Когда вы работаете с большим количеством небольших файлов, для этого потребуется большое количество картографических и редукторных файлов. Настройка / завершение может быть сопоставима со временем обработки самого файла, что приводит к большим накладным расходам. cat Использование файлов должно уменьшить число циклов выполнения цикла, выполняемых преобразователями для задания, что должно повысить производительность.

Преимущество использования файловой системы HDFS для хранения файлов будет в распределенном режиме с несколькими компьютерами. Файлы будут храниться в блоках (по умолчанию 64 МБ) на разных машинах, и каждая машина будет способна обрабатывать блок данных, который находится на машине. Это уменьшает использование полосы пропускания сети, поэтому она не становится узким местом в обработке.

Архивирование файлов, если hadoop собирается их разархивировать, просто приведет к тому, что у hadoop останется большое количество маленьких файлов.

Надеюсь, это поможет вам понять.

3 голосов
/ 12 мая 2011

Исходя из моего все еще ограниченного понимания og Hadoop, я считаю, что правильным решением было бы создание SequenceFile (s), содержащих ваши файлы HTML в качестве значений и, возможно, URL в качестве ключа. Если вы выполняете задание M / R над SequenceFile, каждый картограф будет обрабатывать много файлов (в зависимости от размера разделения). Каждый файл будет представлен функции карты как один вход. Вы можете использовать SequenceFileAsTextInputFormat в качестве InputFormat для чтения этих файлов.

Также см .: Предоставление нескольких нетекстовых файлов для одной карты в Hadoop MapReduce

2 голосов
/ 08 июня 2011

Я недавно добавил эту статью в закладки, чтобы прочитать ее позже, и нашел здесь тот же вопрос :) Запись немного старая, не совсем уверен, насколько она актуальна сейчас. Изменения в Hadoop происходят очень быстрыми темпами.

http://www.cloudera.com/blog/2009/02/the-small-files-problem/

Запись в блоге принадлежит Тому Уайту, который также является автором "Hadoop: Полное руководство, второе издание", рекомендуемого для тех, кто только начинает работать с Hadoop.

http://oreilly.com/catalog/0636920010388

1 голос
/ 09 мая 2011

Можете ли вы объединить файлы перед отправкой в ​​Hadoop?

0 голосов
/ 29 марта 2014

CombineFileInputFormat может использоваться в этом случае, который хорошо работает для большого количества маленьких файлов.Это упаковывает много таких файлов в один раздел, таким образом, каждый картограф должен обрабатывать больше (1 разделение = 1 задача карты).Общее время обработки для mapreduce также будет падать, так как работает меньшее число картографов.Поскольку нет входного формата с поддержкой архивов, использование CombineFileInputFormat повысит производительность.

...