ekb 2013 artemkin(1)
DESCRIPTION
TRANSCRIPT
![Page 1: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/1.jpg)
Павел АртёмкинРуководитель группы
Разработка C++ API для реализации алгоритмов на
больших графах
Я. Субботник в Екатеринбурге, 6 июля 2013
![Page 2: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/2.jpg)
2
● Сколько весит Web-граф● Модель вычислений● Алгоритмы на C++
![Page 3: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/3.jpg)
Алгоритм Дейкстры
std::queue<vertex*> q;
q.push(get_first_vertex());
while (!q.empty()) { vertex* v = q.front(); q.pop();
for (auto& e : v>edges) { if (e.dst>value == 0 || v>value + e.weight < e.dst>value) { e.dst>value = v>value + e.weight; q.push(e.dst); } }}
1
2
3
4
5
3
● Применим, если граф можно загрузить в память одного сервера.
![Page 4: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/4.jpg)
Исходные данные● Ссылочная база — 65 Тб.
Параметры графа:● 256 млрд. вершин.● 2 000 млрд. (2 трлн.) рёбер.
Сервера:● Память 64 Гб, диски – 6.2Тб.● Минимум 10 серверов для хранения базы.● Имеется 50 серверов для расчётов.
4
![Page 5: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/5.jpg)
...И это только начало
struct addrinfo* result;struct addrinfo* rp;int s;
ret = getaddrinfo(NULL, str, &hints, &result);
for (rp = result; rp != NULL; rp = rp>ai_next) { s = socket(rp>ai_family, rp>ai_socktype, rp>ai_protocol);
if (s == 1) continue; if (bind(s, rp>ai_addr, rp>ai_addrlen) == 0) break; close(s);}
if (rp == NULL) { fprintf(stderr, "Could not bind\n"); exit(EXIT_FAILURE);}
freeaddrinfo(result);5
![Page 6: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/6.jpg)
Сложности
Передача данных по сети (ненадёжно)● потеря связности● перегрузка коммутаторов
Сервера● выход из строя дисков (ошибки в данных)● полный отказ сервера (недоступен)
6
![Page 7: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/7.jpg)
МОДЕЛЬ ВЫЧИСЛЕНИЙ
![Page 8: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/8.jpg)
Алгоритм Дейкстры
std::queue<vertex*> q;
q.push(get_first_vertex());
while (!q.empty()) { vertex* v = q.front(); q.pop();
for (auto& e : v>edges) { if (e.dst>value == 0 || v>value + e.weight < e.dst>value) { e.dst>value = v>value + e.weight; q.push(e.dst); } }}
1
2
3
4
5
8
● На каждом сервере хранится только часть графа (вершины, исходящие ссылки).
![Page 9: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/9.jpg)
void compute (v, msgs) { for (auto& m : msgs) v>value = min(v>value, m>value); for (auto& e : v>edges) send(e.key, v>value + e.value);}
value
msg
msg
msg
msg
9
![Page 10: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/10.jpg)
Функторы● Load – загрузка данных.● Compute – вычисления.● Dump – выгрузка.● Partition – диспетчеризация сообщений.
10
![Page 11: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/11.jpg)
Состояние вершины (условие вызова Compute)● ACTIVE – всегда.● WAIT – если есть входящие сообщения.● HALT – никогда.
void compute (v, msgs) { for (auto& m : msgs) v>value = min(v>value, m>value); for (auto& e : v>edges) send(e.key, v>value + e.value);}
11
1
2
3
4
5
![Page 12: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/12.jpg)
Сообщения● Передаются между вершинами.● Можно послать в любую вершину, но в большинстве алгоритмов,
между вершинами, соединёнными рёбрами.
12
1
2
3
4
5
![Page 13: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/13.jpg)
C++ API
![Page 14: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/14.jpg)
Обрабатываемые данные
Значения — ключ, вершина, ребро, сообщение.В разных задачах разные типы (целое, дробное, структура)
Возможные варианты:● Строки:
● время на преобразование● большой объём
● Динамические типы:● сопоставление с типами языка С++● собственный язык описание алгоритмов
● Шаблоны С++
14
![Page 15: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/15.jpg)
Шаблоны C++
● Получать алгоритмы, оптимизированные под конкретные типы данных.
● Метапрограммирование с использованием шаблонов, позволяет выбрать оптимальный способ сохранения данных, в зависимости от типа:● Если типы данных POD (plain old data), то их можно сохранять с
помощью memcpy.● Если не-POD, то использовать serialize.
15
![Page 16: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/16.jpg)
КОД
![Page 17: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/17.jpg)
template <class TDomain>struct TLoadFunction { virtual void Load(IGraph<TDomain>*) = 0;};
/// Пример формирования графаvirtual void Load(IGraph<TDomain>* w) { w>AddVertexWithValue(1, 0, ACTIVE); w>AddVertexWithValue(2, 0); w>AddVertexWithValue(3, 0); w>AddVertexWithValue(4, 0); w>AddVertexWithValue(5, 0);
w>AddEdgeWithValue(1, 2, 3); w>AddEdgeWithValue(1, 3, 5); w>AddEdgeWithValue(2, 3, 1); w>AddEdgeWithValue(2, 4, 2); w>AddEdgeWithValue(2, 5, 7); w>AddEdgeWithValue(3, 5, 1); w>AddEdgeWithValue(4, 5, 8);}
17
1
2
3
4
5
![Page 18: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/18.jpg)
template <class TDomain>struct TDumpFunction { virtual void Dump(IGraph<TDomain>*) = 0;};
/// Пример вывода результатовvirtual void Dump(IGraph<TDomain>* g) { for (auto v = g>GetVertexIterator(); v.Valid(); v.Next()) { std::cout << v.Key() << “ “ << v.Value() << std::endl; } }
18
![Page 19: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/19.jpg)
template <class TDomain>struct TComputeFunction { virtual void Compute(TVertexState*, TMessageIterator*, TMessageOutput*) = 0;};
19
![Page 20: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/20.jpg)
/// Интерфейс предоставления доступа к состоянию текущей/// Computeобрабатываемой вершине в функцииstruct TVertexState { TV* MutableValue();
const TKey& Key() const; const TV& Value() const;
TEdgeIterator* GetOutEdgeIterator() const;
void Activate(); void Halt(); void Wait();};
/// Интерфейс для отправки сообщений и изменения графаstruct TMessageOutput { /// Отправить сообщение всем вершинам /// из указанной последовательности void SendMessageTo(TEdgeIterator* edges, const TM& msg);
/// Отправить сообщение указанной вершине void SendMessageTo(const TKey& key, const TM& msg);};
20
![Page 21: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/21.jpg)
Дейкстра
struct TCompute : TComputeFunction<TDomain> { virtual void Compute(TVertexState* v, TMessageIterator* msgs, TMessageOutput* output) { for (auto& m : msgs) *v>MutableValue() = min(v>Value(), m>Value()); for (auto& e : v>GetOutEdgeIterator()) output>SendMessageTo(e.Key(), v>Value() + e.Value()); v>Wait(); }};
21
![Page 22: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/22.jpg)
PageRank
struct TCompute : TComputeFunction<TDomain> { virtual void Compute(TVertexState* v, TMessageIterator* msgs, TMessageOutput* out) { if (Context().GetTick() >= 1) { *v>MutableValue() = 0.15 + 0.85 * Sum(msgs)); }
auto edges = v>GetOutEdgeIterator(); if (edges>Valid()) out>SendMessageTo(edges, v>Value() / edges>Size()); else out>SendMessageBroadcast( v>Value() / Context().GraphInfo().GetVertices() ); if (Context().GetTick() >= Data()>MaxIterations) v>Halt(); }};
22
![Page 23: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/23.jpg)
Режимы работы (память)
● Все данные графа хранятся в памяти.● Быстро, но объём обрабатываемых данных, ограничен размером
оперативной памяти сервера.
template <class TDomain, class TFunctors> struct TMemoryInstance : IInstance { virtual void Load() { typename TFunctors::TLoad load; load.Load(&MemoryGraph_); } virtual bool Compute(); virtual void Dump();}
23
![Page 24: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/24.jpg)
Режимы работы (диск)
● Данные графа и сообщений хранятся на диске при обработки используются алгоритмы внешней сортировки.
● Медленнее, но позволяет обрабатывать в 50 — 100 раз больший объём данных на том же сервере.
24
![Page 25: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/25.jpg)
Выполнение
template < class TDomain, class TFunctors, class <class D, class F> class TInstance> struct TLocalRunner { typedef TInstance<TDomain, TFunctors> TInstance;
void Run(const TInstanceConfig& config) { Instance_>Configure(config); Instance_>Load(); while (true) { if (!Instance_>Compute()) break; } Instance_>Dump(); }}
25
![Page 27: Ekb 2013 artemkin(1)](https://reader034.vdocuments.pub/reader034/viewer/2022050808/5486c37ab479590a0d8b5283/html5/thumbnails/27.jpg)
Домен данных
template <class K, class V, class E, class M>struct TLoadFunction { virtual void Load(IGraph<K, V, E, M>*) = 0;}
template <class K, class V, class E, class M>struct TDomain { typedef K TK; typedef V TV; typedef E TE; typedef M TM;}
typedef TDomain<int, int, int, int> TMyDomain;
struct TLoad : TLoadFunction<TMyDomain> { ...};
27