260 likes | 655 Views
Pregel. Анцелевич Антон. Река Преголя. Авторы. Grzegorz Malewicz Matthew H . Austern Aart J . C . Bik James C . Dehnert Ilan Horn Naty Leiser Grzegorz Czajkowski. Распараллеливание графа. Структура вычислений не известна а-приори Трудно локализовать вычисления
E N D
Pregel Анцелевич Антон
Авторы • Grzegorz Malewicz • Matthew H. Austern • Aart J. C. Bik • James C. Dehnert • Ilan Horn • Naty Leiser • Grzegorz Czajkowski
Распараллеливание графа • Структура вычислений не известна а-приори • Трудно локализовать вычисления • Всем нужна структура графа
Существующие подходы • По мере поступления • MapReduce – ужасно функциональный • Sawzall, PigLatin – только данные • Не параллелить – BGL (C++), LEDA (С++), NetworkX (Python) и пр. • Parallel BGL и CGMgraph – не отказоустойчивы.
Valiant's Bulk Synchronous Parallel • Компоненты • Главный – «роутер» • Интервалы, супершаги
Поиск максимального значения 3 6 2 1
Поиск максимального значения 6 6 2 6
Поиск максимального значения 6 6 6 6
Поиск максимального значения 6 6 6 6
class Vertex • template <typename VertexValue, typename EdgeValue, typename MessageValue> class Vertex • const VertexValue& GetValue(); • VertexValue* MutableValue(); • OutEdgeIterator GetOutEdgeIterator(); • void SendMessageTo(const string& dest_vertex, const MessageValue& message); • void VoteToHalt();
Изменение структуры графа • частичное упорядочение • удаление рёбер, удаление вершин, добавление вершин, добавление рёбер • обработчики.
Инфраструктура • Google clusters • GFS • BigTable
Работа всей системы • Master, workers • Разбиение графа • Раздача кусочков графа • Мастер: «Run, workers, run» + супершаг • Воркеры: «Да, о, повелитель!» • Мастер: «Приберегите свои кусочки»
Отказоустойчивость • Точки восстановления • Confined recovery
PageRank • Sergey Brin и Lawrence Page • PR(A) = (1-d)+ d(PR(T1)/C(T1)+... +PR(Tn)/C(Tn)) • Итеративный алгоритм: PR(A)/n=(0.15/n + 0.85*sum)/(C(A))
PageRank – Код на C++ • class PageRankVertex : public Vertex<double, void, double> { • public: • virtualvoid Compute(MessageIterator* msgs) { • if (superstep() >= 1) { • double sum = 0; • for (; !msgs->Done(); msgs->Next()) • sum += msgs->Value(); • *MutableValue() = 0.15 / NumVertices() + 0.85 * sum; • } • if (superstep() < 30) { • const int64 n = GetOutEdgeIterator().size(); • SendMessageToAllNeighbors(GetValue() / n); • } else { • VoteToHalt(); • } • } • };
SSSP • class ShortestPathVertex : public Vertex<int, int, int> { • void Compute(MessageIterator* msgs) { • int mind = IsSource(vertex_id()) ? 0 : INF; • for (; !msgs->Done(); msgs->Next()) • mind = min(mindist, msgs->Value()); • if (mindist < GetValue()) { • *MutableValue() = mind; • OutEdgeIterator it = GetOutEdgeIterator(); • for (; !it.Done(); it.Next()) • SendMes(it.Target(), mind + it.GetV ()); • }VoteToHalt(); • } • };
SSSP Combiner • class MinIntCombiner : public Combiner<int> { • virtualvoid Combine(MessageIterator* msgs) { • int mindist = INF; • for (; !msgs->Done(); msgs->Next()) • mindist = min(mindist, msgs->V()); • Output("combined_source", mindist); • } • };
Максимальное паросочетание • High Speed Switch Scheduling for Local Area Networks, 1993 — Thomas E. Anderson, Susan S. Owicki, James B. Saxe, and Charles P. Thacker • Этапы: 0,1,2,3 – номер супершага mod 4
Тестирование • Бинарные деревья (1 млрд вершин)
Тестирование • Бинарные деревья (800 workers)
Тестирование • Графы с логнормальным распределением полустепеней исхода
Что можно сделать? • Ослабить синхронность • Перебросить данные на диски • Уменьшить количество сообщений
Google • 80%: MapReduce – индексирование, Google News, Google Trends, Google Maps, Google Translate • 20%: Видимо, Pregel – всякое разное, что именно – неизвестно =(