Мотивация: распределенная обработка графов
Алгоритмы партиционирования графов
Мотивация: распределенная обработка графов
Иногда графовые данные достигают таких больших объемов, что граф перестает помещаться в оперативную память одной машины. Возникает потребность в распределенной обработке на вычислительных кластерах, которые состоят из нескольких узлов. Расскажем, как организовать распределенное вычисление графовых алгоритмов.
Классический подход —
На реальных графах
Так граф хранится в GraphX
Задача: реберное разбиение графов
На работу фреймворков вроде Spark сильно влияет стратегия распределения ребер по вычислительным узлам.
Формализуем задачу: дан граф G=(V, E) и число n (количество вычислительных узлов). Мы хотим разбить множества ребер графа на n частей (партиций). Если нужна более наглядная интерпретация, мы хотим раскрасить ребра графа в n цветов. В этой статье мы будем отождествлять цвета и партиции, а еще — использовать слова «разбиение» и «раскраска» как синонимы.
Скажем, разбиение — это функция 𝑓:E → [n] из множества ребер в множество цветов. Наша задача — найти разбиение, которое минимизирует две метрики.
Дисбаланс описывает, насколько равномерно данные, а значит и вычислительная нагрузка, распределятся по узлам кластера. Важно минимизировать его, чтобы избежать ситуации, в которой одни вычислительные узлы долго простаивают в ожидании других узлов.
Средний фактор репликации отражает, как много копий у вершин нам пришлось хранить. Еще он показывает объем коммуникаций при вычислениях, потому что обычно во время работы алгоритмов вершина сообщает об изменениях себя всем своим копиям.
Таким образом мы получили задачу о реберном разбиении графов. Эта задача
Сформулируем другие требования к алгоритмам:
Как решали задачу
Мы будем говорить о классе стриминговых алгоритмов без состояния. Это алгоритмы, которые для каждого ребра e=(v, u) определяют его цвет, не используя никакой информации о других ребрах — обычно для этого так или иначе используются хэши номеров вершин. Такие алгоритмы позволяют разбить граф в процессе считывания с диска, то есть с очень маленькими дополнительными издержками. Может показаться, что они не позволяют получить ничего сильно лучше случайного разбиения, но это не так. Мы опишем подход, который позволяет строить алгоритмы в таком классе с хорошими гарантиями на фактор репликации всех вершин.
Пример разбиения полного графа на 3 части с дисбалансом 1 и фактором репликации 2. Слева — семейство множеств на 3 элементах, справа — раскраска полного графа, полученная с его помощью. У нее идеальный баланс
В подходе, который мы описываем, для разбиения графа на n цветов нам нужна система множеств F, каждый элемент которой является некоторым множеством цветов.
Алгоритмы устроены следующим образом:
Такие алгоритмы дают подходящее разбиение, если использовать хорошие семейства F. Определим, какие семейства F являются хорошими:
Итак, мы связали задачу партиционирования ребер со следующей комбинаторной задачей: по числу n построить симметричное пересекающееся семейство множеств на n элементах с как можно меньшим рангом.
Вот что известно про симметричные пересекающиеся семейства:
Наш метод: сбалансированные системы множеств
Мы обнаружили, что требование к симметричности семейств избыточное. Грубо говоря, мы придумали, как можно ослабить условие симметричности и за счет этого получить алгоритм партиционирования с лучшими гарантиями, чем были известны до этого.
Раскраска полного графа в два цвета, построенная на основе сбалансированных пересекающихся систем. Фактор репликации — примерно 1+ 1/√2
Мы расширяем класс алгоритмов партиционирования. Это работает так:
В итоге для построения разбиения нам нужно знать не только семейство F, но и описанные выше вероятности. Набор из семейства и вероятностей мы называем системой.
Кроме того, теперь семейство F не обязано быть симметричным. Вместо этого мы напрямую требуем, чтобы описанная выше процедура давала одинаковую вероятность всех цветов. Если это условие выполняется, мы называем систему сбалансированной. Из симметричного семейства всегда можно сделать сбалансированную систему, но обратное неверно.
Для сбалансированных пересекающихся систем все еще верна нижняя оценка на ранг √n, однако теперь у нас получилось лучше к ней приблизиться и построить семейства с рангом √n (1+o (1)) для всех n.
Идея состоит в следующем: мы используем конструкцию оптимальных сбалансированных и даже симметричных систем на основе конечных проективных плоскостей. Такие существуют в случае n=q²+q+1, где q — степень простого числа.
Чтобы построить систему для произвольного n, мы строим проективную плоскость на некотором подмножестве элементов n, а затем достраиваем ее до сбалансированной системы с помощью специальной комбинаторной конструкции. Эта конструкция увеличивает ранг системы, но благодаря тому, что числа вида q²+q+1 достаточно плотно расположены на числовой прямой, ранг увеличится не сильно. В результате мы получили алгоритм партиционирования, который гарантирует фактор репликации √n (1+o (1)) для любого числа партиций n.
Подход с применением сбалансированных систем оптимальный в худшем случае. Мы доказали, что для каждого конкретного n получим верхние оценки фактора репликации, которые достигаются на полном графе, если применим правильную систему на n элементах. Как следствие — не существует алгоритма, который бы давал лучшие гарантии вне зависимости от графа. Однако на некоторых графах или классах графов другие алгоритмы могут работать лучше.
Кроме того, мы знаем, что в случайных графах Эрдё
Планы
Мы хотим, чтобы наши теоретические исследования можно было применять на практике. Например, сейчас разрабатываем эвристический алгоритм партиционирования, который должен давать более качественное разбиение на реальных социальных графах.
Наша команда изучает и другие направления, в которых академические темы с большой базой теоретических результатов приносят пользу в продуктах.