__Описание структуры каталогов:*
gmr.cpp |
gmr.h |
algorithms.h |
graph.h |
Компиляция и запуск
Компиляция gmr:
make clean && make
Запуск gmr
Одиночный запуск:
./startgmr.sh [algorithm] [partition] [graphfile]
./startgmr.sh
./startgmr.sh pagerank
./startgmr.sh sssp random
./startgmr.sh sssp metis 4elt
./startgmr.sh pagerank metis small
Запуск на кластере:
./startgmr.sh cluster hosts [algorithm] [partition] [graphfile]
./startgmr.sh cluster hosts
./startgmr.sh cluster hosts pagerank
./startgmr.sh cluster hosts sssp random
./startgmr.sh cluster hosts sssp metis 4elt
./startgrm.sh cluster hosts pagerank metis small
В настоящее время доступны два метода разделения графа:
На данный момент инструмент разделения использует библиотеку Metis. Исходный код и документация находятся в include/metis/, а компиляцию можно выполнить, следуя инструкциям в include/metis/README.md.
Основа структуры
Узел ID | Вес узла | ID соседа 1 | Местоположение соседа 1 | Вес ребра 1 | ... | ID соседа N | Местоположение соседа N | Вес ребра N |
---|---|---|---|---|---|---|---|---|
vertex_id | vertex_weight | neighbor1 | neighbor1.location | edge1.weight | ... | neighborN | neighborN.location | edgeN.weight |
Для тестирования предоставляются три различных размера графов: small, 4elt и mdual, с количеством вершин от нескольких десятков до нескольких сотен тысяч.
Процесс итерационных вычислений
Создать вершины Vertex на основе данных в буфере обмена и экземпляра графа graph, а затем применить бизнес-логику функции map для генерации списка ключей и значений (key/value list) из вершин Vertex.
3. Сортировка сгенерированного списка key/value: sort
4. Вычисление 2th/2: reduce
Применить бизнес-логику функции reduce к отсортированному списку ключей и значений для его сокращения.
5. Обновление результата вычисления reduce в графе graph
6. (Необязательно) Для совместимости с неструктурными данными MapReduce
В дополнение к локальной сортировке между Map и Reduce, фреймворк также реализует глобальную сортировку. Это позволяет поддерживать вычисления MapReduce для неструктурных данных.
Графические и неграфические вычисления MapReduce отличаются в процессе вычислений. Фреймворк поддерживает оба типа вычислений, реализуя глобальную сортировку между Map и Reduce.
Рисунок: Сравнение графических и неграфических вычислений MapReduce
Пример: PageRank
4.1.1 Простой граф с 10 вершинами разделён на три подграфа subgraphs[3]:
Рисунок: Простой граф с 10 вершинами
4.1.2 Итерационный процесс
Каждая подгруппа отправляет свои граничные вершины своим соседям, используя MPI_Alltoall().
Внутри каждого вычислительного узла каждая вершина <id, loc, [neighbors]> применяет функцию map, создавая несколько пар ключ-значение: {key, value1}, где key находится среди соседей, а value1 равно значению, делённому на количество соседей.
void map(Vertex &v, std::list<KV> &kvs){
int neighbor_count = 0;
while(v.neighbors[neighbor_count] != 0)neighbor_count++;
float value = v.value / neighbor_count;
for (int i = 0; i < neighbor_count; i++)
kvs.push_back({v.neighbors[i], value});
}
В каждом узле пары ключ-значение, созданные функцией map, сортируются по ключу.
Функция reduce применяется к группам пар ключ-значение с одинаковыми ключами.
KV reduce(std::list<KV> &kvs) {
float sum = 0.0;
for (auto kv : kvs) {
sum += kv.value;
}
/*Pagerank=a*(p1+p2+…Pm)+(1-a)*1/n,其中m是指向网页j的网页j数,n所有网页数*/
sum = 0.5 * sum + (1 - 0.5) / (sizeof(vs) / sizeof(Vertex) - 1);
return {kvs.front().key, sum};
}
Проблемы завершения и ловушки в PageRank
Поведение пользователя в сети является примером процесса Маркова. Для обеспечения сходимости необходимо выполнение условия: граф должен быть сильно связным, то есть должна существовать возможность перехода от любой страницы к любой другой странице.
Однако в интернете страницы не всегда удовлетворяют этому условию, так как некоторые страницы не указывают ни на какие другие страницы. Если следовать приведённым выше расчётам, пользователь, попав на такую страницу, оказывается в тупике, что приводит к обнулению накопленной вероятности перехода. В результате конечный вектор распределения вероятностей почти полностью состоит из нулей.
Предположим, мы удалим связь между C и A в исходном графе, превратив C в тупик. Получим следующий граф:
Рисунок: Граф с тупиковой страницей C
Ещё одна проблема — это «ловушки», когда некоторые страницы имеют ссылки только на себя. Например:
Рисунок: Ловушка на странице C
Пользователь, попавший на страницу C, застревает в ней, и все вероятности распределяются на эту страницу. Это делает бессмысленным ранжирование остальных страниц.
Алгоритм кратчайшего пути с одним источником SSSP (алгоритм Дейкстры)
Задача подсчёта треугольников TriangleCount
Параллельный алгоритм поиска в ширину BFS с использованием MapReduce
Двудольный граф и алгоритм распространения меток Pregel
Таблица сравнения процессоров и платформ для различных алгоритмов:
Processor\Platform | GMR | Spark | GraphX | GraphLab | Pregel |
---|---|---|---|---|---|
1 | |||||
3 | |||||
8 | |||||
16 | |||||
32 |
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )