Распределение данных
Общепринятая точка зрения относительно крупномасштабных баз данных состоит в том, что вычисления следует выполнять рядом с данными, и что не следует пересылать объемные данные к месту их обработки. Другими словами, лучше послать по сети небольшую программу на узел с данными, чем импортировать с него большой объем данных. В параллельных СУБД с пользой применяется знание о распределении данных и их местоположении: параллельный оптимизатор запросов старается балансировать вычислительную нагрузку, минимизируя при этом объем данных, передаваемых по сети, которая соединяет узлы кластера.
За исключением начального планирования расположения экземпляров Map, MR-программист должен выполнять эти задачи вручную. Например, предположим, что пользователь пишет MR-программу из двух частей для обработки набора документов. Сначала функция Map сканирует документы и создает гистограмму часто встречающихся слов. Затем эти документы передаются функции Reduce, которая группирует файлы по именам сайтов, откуда они происходят. Теперь этот или другой пользователь хочет на основе этой работы найти сайты, содержащие документы с более чем пятью вхождениями слов «Google» или «IBM». При наивной реализации этого запроса, в которой Map выполняется над собранной статистикой, фильтрация выполняется после того, как статистика подсчитана для всех документов и передана обработчикам Reduce, даже если заданному условию удовлетворяет только небольшая часть документов.
Аналогичное вычисление производят следующие представление и оператор выборки на языке SQL:
CREATE VIEW Keywords AS SELECT siteid, docid, word, COUNT(*) AS wordcount FROM Documents GROUP BY siteid, docid, word;
SELECT DISTINCT siteid FROM Keywords WHERE (word = ‘IBM’ OR word = ‘Google’) AND wordcount > 5;
В современных СУБД второй запрос был бы переписан таким образом, чтобы в разделе FROM ссылка на таблицу Keywords была заменена определением представления. После этого оптимизатор может выбрать план выполнения запроса, в котором раздел WHERE запроса будет применяться к таблице Documents до вычисления COUNT, что позволит существенно сократить объем вычислений. Если документы распределены по нескольким узлам, то этот фильтр можно применить на каждом узле до группирования документов по сайтам, к которым они относятся, что существенно уменьшит объем данных, передаваемых по сети.