Вопрос

Глядя на комбинацию MapReduce и HBase с точки зрения потока данных, моя проблема кажется подходящей.У меня есть большой набор документов, которые я хочу сопоставить, объединить и уменьшить.Моя предыдущая реализация SQL заключалась в разбиении задачи на пакетные операции с кумулятивным сохранением результата Map в таблице, а затем выполнением эквивалента сокращения.Преимущество этого заключалось в том, что в любой момент выполнения (или между выполнениями) у меня были результаты Map на этот момент времени.

Насколько я понимаю, запуск этого задания в качестве MapReduce потребует каждый раз запуска всех функций Map.

Функции My Map (да и любая функция) всегда выдают один и тот же результат для заданного ввода.Просто нет смысла пересчитывать результат, если в этом нет необходимости.Мой ввод (набор документов) будет постоянно расти, и я буду периодически запускать операцию MapReduce над данными.Между выполнениями мне действительно нужно будет вычислять функции Map для вновь добавленных документов.

Мои данные, вероятно, будут HBase -> MapReduce -> HBase.Учитывая, что Hadoop представляет собой целую экосистему, он может знать, что данная функция была применена к строке с заданным идентификатором.Я предполагаю неизменяемые записи в таблице HBase.Может ли Hadoop это учитывать?

Из документации (особенно видеороликов Cloudera) мне стало известно, что повторный расчет (потенциально избыточных данных) может быть быстрее, чем сохранение и извлечение класса проблем, для решения которых используется Hadoop.

Есть комментарии/ответы?

Это было полезно?

Решение

Если вы хотите избежать выполнения шага Map каждый раз, выделите его как отдельный шаг (либо с помощью IdentityReducer, либо установив количество редукторов для задания равным 0) и запускайте последующие шаги, используя выходные данные шага карты. .

Будет ли это на самом деле быстрее, чем каждый раз пересчитывать необработанные данные, зависит от объема и формы входных данных по сравнению с объемом и формой входных данных.выходные данные, насколько сложен ваш шаг карты и т. д.

Обратите внимание, что запуск вашего картографа на новых наборах данных не будет добавляться к предыдущим запускам, но вы можете обойти это, используя датированную выходную папку.Это означает, что вы можете сохранить результаты сопоставления первой партии файлов в my_mapper_output/20091101, и партия на следующую неделю в my_mapper_output/20091108, и т. д.Если вы хотите уменьшить весь набор, вы сможете передать my_mapper_output в качестве входной папки и перехватить все выходные наборы.

Другие советы

Почему бы не применить рабочий процесс SQL в другой среде?Это означает, что добавьте «обработанный» столбец в таблицу ввода.Когда придет время запустить сводку, запустите конвейер, который выглядит примерно так:

map (map_function) on (входная таблица, отфильтрованная по !processed);сохраните в map_outputs либо в hbase, либо просто в hdfs.

карта (функция уменьшения) на (map_outputs);сохранить в hbase.

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

Вот интересная презентация, показывающая, как одна компания построила свой рабочий процесс (хотя они не используют Hbase):http://www.scribd.com/doc/20971412/Hadoop-World-Production-Deep-Dive-with-High-Availability

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top