Кэширование приложений Map в Hadoop MapReduce?
-
18-09-2019 - |
Вопрос
Глядя на комбинацию 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