Запуск задания MR для части файла HDFS - PullRequest
1 голос
/ 26 января 2012

Представьте, что в hdtf хранится большой файл, содержащий структурированные данные.Теперь цель состоит в том, чтобы обработать только часть данных в файле, как все строки в файле, где значение второго столбца находится между такими-то и такими-то.Можно ли запустить задание MR таким образом, чтобы hdfs передавали только потоковую информацию по соответствующей части файла, а не по потоку всего на мапперы.

Причина в том, что я хочу повысить скорость работы, работая только с той частью, котораяЯ нуждаюсь.Вероятно, один из подходов состоит в том, чтобы запустить задание MR для создания нового файла, но мне интересно, можно ли этого избежать?

Обратите внимание, что цель состоит в том, чтобы хранить данные в HDFS, и я не хочу читатьи запись из базы данных.

Ответы [ 4 ]

2 голосов
/ 26 января 2012

HDFS хранит файлы в виде набора байтов в блоках, и нет индексации, и, следовательно, нет способа читать только часть вашего файла (по крайней мере, на момент написания этой статьи).Более того, любой данный маппер может получить первый блок файла или 400-й, и вы не можете это контролировать.

Тем не менее, весь смысл MapReduce в том, чтобы распределить нагрузку по многим машинам.В нашем кластере мы одновременно запускаем до 28 картографов (7 на узел на 4 узлах), поэтому, если мой входной файл равен 1 ТБ, каждый слот карты может закончить чтение только 3% от общего файла или около 30 ГБ.Вы просто выполняете фильтр, который вам нужен, в маппере и обрабатываете только те строки, которые вам интересны.

Если вам действительно нужен фильтрованный доступ, вы можете захотеть взглянуть на хранение ваших данных в HBase.Он может выступать в качестве собственного источника для заданий MapReduce, обеспечивает фильтрованное чтение и сохраняет свои данные в HDFS, поэтому вы все еще находитесь в распределенном мире.

1 голос
/ 26 января 2012

Один из ответов касается того, как улей решает эту проблему.Данные находятся в «таблицах», которые на самом деле являются просто метаданными о файлах на диске.Hive позволяет вам установить столбцы, на которые разделена таблица.Это создает отдельную папку для каждого раздела, поэтому, если бы вы разбивали файл по дате, у вас было бы:

/mytable/2011-12-01
/mytable/2011-12-02

Внутри каталога даты были бы ваши настоящие файлы.Поэтому, если вы затем выполните запрос, например:

SELECT * FROM mytable WHERE dt ='2011-12-01'

Только файлы в / mytable / 2011-12-01 будут введены в работу.

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

0 голосов
/ 23 января 2013

Если файлы, которые вы хотите обработать, имеют какой-то уникальный атрибут относительно их имени файла (например, расширение или частичное совпадение имени файла), вы также можете использовать метод setInputPathFilter в FileInputFormat, чтобы игнорировать все, кроме тех, которые вы хотите для своей работы MR.Hadoop по умолчанию игнорирует все файлы / dirs ".xxx" и _xxx ", но вы можете расширить его с помощью setInputPathFilter.

Как уже отмечали другие, вы, скорее всего, получите неоптимальную производительность вашего кластера, выполняя что-то вродеэто нарушает парадигму «один блок на маппер», но иногда это приемлемо. Иногда может потребоваться больше, чтобы «сделать все правильно», особенно если вы имеете дело с небольшим количеством данных и временем на перестройку и /или повторный дамп в HBase затмит дополнительное время, необходимое для неоптимального выполнения вашей работы.

0 голосов
/ 29 января 2012

Большая часть затрат на обработку - это анализ данных для получения ключевых значений для картографа.Мы создаем там (обычно) один Java-объект на значение + некоторый контейнер.Это дорого как с точки зрения нагрузки на процессор, так и на сборщик мусора
Я бы предложил решение "посередине".Вы можете написать входной формат, который будет читать входной поток и пропускать не относящиеся к делу данные на ранней стадии (например, просматривая несколько первых байтов строки).
В результате вы будете читать все данные, но на самом деле анализировать и передавать в Mapper - только часть.
Другой подход, который я рассмотрю, - это использовать формат RCFile (или другой столбчатый формат) и позаботитьсяэти релевантные и не относящиеся к делу данные будут находиться в разных столбцах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...