2012-01-26 4 views
1

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

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

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

ответ

2

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

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

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

+1

Сопроцессоры, введенные в 0,92, могут также использоваться для фильтрации данных, аналогичных фильтрам. Не совсем точно, какая разница между сопроцессорами и фильтрами. Одна вещь, о которой я могу думать, - фильтры определены на клиенте, а сопроцессоры определены на сервере. Таким образом, сопроцессоры могут использоваться повторно для клиентов. Следует отметить, что и фильтры, и сопроцессоры выполняются на сервере и сокращают данные, отправленные клиенту. –

+0

Хорошая точка Praveen. Но я понимаю, что сопроцессоры предназначены только для базы, а не просто HDFS M/R –

+0

Chris - Вы имеете в виду HBase, а не базу? Что останавливает сопроцессоры, используемые в МР? Я разместил запрос в группах HBase для разницы между сопроцессорами и фильтрами, но не получил ответа. –

1

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

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

Внутри каталога дата будет вам сами файлы. Так что, если вы после этого побежали запрос как:

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

только файлы в/туЬаОм/2011-12-01 будет подаваться в работу.

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

+0

Просто FYI, этот метод называется «разбиение». Он использовался в реляционных базах данных довольно долгое время. – Olaf

0

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

0

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

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

Смежные вопросы