Сравнение подходов к крупномасштабному анализу данных

Параллельные СУБД


Системы баз данных, способные функционировать в кластерах узлов без общих ресурсов, существуют с конца 1980-х. Все эти системы поддерживают стандартные реляционные таблицы и SQL, и, таким образом, тот факт, что данные хранятся в нескольких машинах, является прозрачным для конечного пользователя. Многие из этих систем основывались на пионерских исследовательских результатах, полученных при выполнении проектов параллельных СУБД Gamma и Grace . Возможность параллельного исполнения обеспечивается двумя ключевыми аспектами: (1) почти все (или даже все) таблицы разделяются по узлам кластера, и (2) в системе используется оптимизатор, транслирующий команды SQL в план запроса, выполнение которого распределяется по нескольким узлам. Поскольку от программистов требуется только указание своей цели на высокоуровневом языке, они не обременяются деталями уровня хранения данных, такими как варианты индексации или стратегии выполнения соединений.

Рассмотрим SQL-команду для фильтрации записей таблицы T1 по некоторому предикату, ее соединения со второй таблицей T2 и вычисления агрегата на результате соединения. Основная схема обработки этой команды на параллельной СУБД включает три фазы. Поскольку таблица T1 хранится в базе данных, уже разделенная по некоторому атрибуту в некотором наборе узлов, сначала в этих узлах параллельно выполняется подзапрос фильтрации аналогично тому, как выполняется фильтрация в функции Map. Далее, в зависимости от размера таблиц применяется один из двух распространенных параллельных алгоритмов соединения. Например, если в таблице T2 содержится небольшое число записей, СУБД могла бы реплицировать ее по всем узлам при начальной загрузке данных. Это позволяет параллельно выполнять соединение во всех узлах. После этого в каждом узле вычисляется агрегат с использованием своей части результата соединения. И, наконец, для вычисления окончательного результата по этим частичным агрегатам требуется завершающий шаг «свертки» (roll-up) .

Если таблица T2 имеет большой размер, то ее содержимое будет распределено между несколькими узлами. Если эти таблицы разделены не по тем атрибутам, которые используются в соединении, система будет должна выполнить хэширование как T2, так и отфильтрованного варианта T1 с использованием некоторой общей хэш-функции. Перераспределение по узлам T2 и отфильтрованного варианта T1 аналогично обработке, которая происходит после завершения функции Map и до начала выполнения Reduce. Как только в каждом узле будут иметься необходимые данные, в них будут выполнены соединение с хэшированием и предварительное вычисление агрегатной функции. На последнем шаге опять потребуется произвести вычисление свертки для получения окончательного результата.

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



Содержание раздела