MapReduce в Hadoop
Графы
Граф как структура данных
G = (V,E)
– V представляет собой множество вершин (nodes)
– E представляет собой множество ребер
(edges/links)
– Ребра и вершины могут содержать
дополнительную информацию
V = {1, 2, 3, 4, 5, 6}
E = {[1,2], [1,4], [1,6], [3,1], … }
W1,2 = 3, W1,4 = 2, W1,6 = 7, W3,1 = 8, …
2
1
4
5
3
6
3
2
7
8
4
1
2
1
5 1
Виды графов
Неориентированный Ориентированный
Несвязный Полный
Двудольный
Дерево
Графы на практике
Структура компьютеров и серверов сети
Социальные сети
Схема метро
Структура дорог
Задачи и проблемы на графах
Поиск кратчайшего пути
• Роутинг траффика
• Навигация маршрута
Поиск минимального остовного дерева
(Minimum Spanning Tree)
• Телекоммуникационные компании
Поиск максимального потока (Max Flow)
• Структура компьютеров и серверов Интернет
Алгоритмы
ссылочного
ранжирования
• PageRank
• HITS
Леонард Эйлер
Проблема семи мостов Кёнигсберга
Графы и MapReduce
• Вычисления на каждой вершине
• Обход графа
Ключевые вопросы:
– Как представить граф в MapReduce?
– Как обходить граф в MapReduce?
Матрица смежности
Граф представляется как матрица M размером n x n
– n = |V|
– Mij = 1 означает наличие ребра между i и j
1 2 3 4
1 0 1 0 1
2 1 0 1 1
3 1 0 0 0
4 1 0 1 0
1
2
3
4
Матрица смежности
Плюсы
– Удобство математических вычислений
– Перемещение по строкам и колонкам
соответствует переходу по входящим и
исходящим ссылкам
Минусы
– Матрица разреженная, множество лишних
нулей
– Расходуется много лишнего места
1 2 3 4
1 0 1 0 1
2 1 0 1 1
3 1 0 0 0
4 1 0 1 0
Списки смежности
Берем матрицу смежности и убираем все нули
1 2 3 4
1 0 1 0 1
2 1 0 1 1
3 1 0 0 0
4 1 0 1 0
1: 2, 4
2: 1, 3, 4
3: 1
4: 1, 3
Списки смежности
• Плюсы
– Намного более компактная реализация
– Легко найти все исходящие ссылки для
вершины
• Минусы
– Намного сложнее подсчитать входящие ссылки
Поиск кратчайшего пути в графе
Алгоритм Дейкстры
0




10
5
2 3
2
1
9
7
4 6
0
10
5


10
5
2 3
2
1
9
7
4 6
0
8
5
14
7
10
5
2 3
2
1
9
7
4 6
0
8
5
13
7
10
5
2 3
2
1
9
7
4 6
0
8
5
9
7
10
5
2 3
2
1
9
7
4 6
0
8
5
9
7
10
5
2 3
2
1
9
7
4 6
Алгоритм Дейкстры
Dijkstra(V, s, w)
for all vertex v ∈ V do
d[v] ← ∞
d[s] ← 0
Q ← {V }
while Q != ∅ do
u ←ExtractMin(Q)
for all vertex v ∈ u.AdjacencyList do
if d[v] > d[u] + w(u, v) then
d[v] ← d[u] + w(u, v)
Поиск кратчайшего пути
• Пусть веса ребер равны 1
• Решение по индукции:
– DISTANCETO(s) = 0
– DISTANCETO(s->p) = 1
– DISTANCETO(n) = 1 + min(DISTANCETO(m), m  M)
s
m3
m2
m1
n
…
…
…
d1
d2
d3
Параллельный поиск в ширину (BFS)
n0
n3
n2
n1 n7
n6
n5
n4
n9
n8
Breadth First Search: представление данных
– Key: вершина n
– Value: d (расстояние от начала), adjacency list (вершины,
доступные из n)
– Инициализация: для всех вершин, кроме начальной, d = 
1 –> [0, {2, 3, 4}]
2 -> [, {5, 6} ]
3 -> [, {} ]
4 -> [, {7, 8} ]
5 -> [, {9, 10} ]
…
Breadth First Search: Mapper
mapper(key, value):
emit(key, value)
m  value.adjacency_list: emit (m, value.d + 1)
Breadth First Search: Mapper
1 –> [0, {2, 3, 4}]
1 –> [0, {2, 3, 4}]
2 -> [1, {} ]
3 -> [1, {} ]
4 -> [1, {} ]
2 -> [, {5, 6} ]
2 –> [, {5, 6}]
5 -> [, {} ]
6 -> [, {} ]
Mapper 1
Mapper 2
Breadth First Search: Reducer
• Sort/Shuffle
– Сгруппировать расстояния по достижимым вершинам
• Reducer:
– Выбрать путь с минимальным расстоянием для каждой
достижимой вершины
– Сохранить структуру графа
Breadth First Search: Reducer
2 –> {[1, {} ], [, {5, 6}]}
2 –> [1, {5, 6} ]
Reduce In:
Reduce Out:
class Mapper
method Map(nid n, node N)
d ← N.Distance
Emit(nid n,N) // Pass along graph structure
for all nodeid m ∈ N.AdjacencyList do
Emit(nid m, d + 1) // Emit distances to
reachable nodes
BFS: псевдокод
class Reducer
method Reduce(nid m, [d1, d2, . . .])
dmin ← ∞
M ← ∅
for all d ∈ counts [d1, d2, . . .] do
if IsNode(d) then
M ← d // Recover graph structure
else if d < dmin then
dmin ← d
M.Distance ← dmin // Update shortest distance
Emit(nid m, node M)
BFS: псевдокод
1 –> [0, {2, 3, 4}]
2 -> [, {5, 6} ]
3 -> [, {} ]
4 -> [, {7, 8} ]
5 -> [, {9, 10} ]
…
1 –> [0, {2, 3, 4}]
2 -> [1, {5, 6} ]
3 -> [1, {} ]
4 -> [1, {7, 8} ]
5 -> [, {9, 10} ]
…
1 –> [0, {2, 3, 4}]
2 -> [1, {5, 6} ]
3 -> [1, {} ]
4 -> [1, {7, 8} ]
5 -> [2, {9, 10} ]
…
1 –> [0, {2, 3, 4}]
2 -> [1, {5, 6} ]
3 -> [1, {} ]
4 -> [1, {7, 8} ]
5 -> [2, {9, 10} ]
…
Input Iteration 1
Iteration 2Result
…
Breadth First Search: Итерации
• Каждая итерация задачи MapReduce смещает границу
продвижения по графу (frontier) на один “hop”
– Последующие операции включают все больше и больше
посещенных вершин, т.к. граница (frontier) расширяется
– Множество итераций требуется для обхода всего графа
• Сохранение структуры графа
– Проблема: что делать со списком смежных вершин
(adjacency list)?
– Решение: Mapper также пишет (n, adjacency list)
BFS: критерий завершения
• Как много итераций нужно для завершения
параллельного BFS?
• Когда первый раз посетили искомую вершину,
значит найден самый короткий путь
• Равно диаметру графа
• Практическая реализация
– Внешняя программа-драйвер для проверки оставшихся вершин с
дистанцией 
– Можно использовать счетчики из Hadoop MapReduce
BFS vs Дейкстра
• Алгоритм Дейкстры более эффективен
– На каждом шаге используются вершины только из пути с
минимальным весом
– Нужна дополнительная структура данных (priority queue)
• MapReduce обходит все пути графа параллельно
– Много лишней работы (brute-force подход)
– Полезная часть выполняется только на текущей границе
обхода
BFS: Weighted Edges
• Добавим положительный вес каждому ребру
• Простая доработка: добавим вес w для каждого
ребра в список смежных вершин
– В mapper, emit (m, d + wp) вместо (m, d + 1) для каждой
вершины m
BFS Weighted: критерий завершения
• Как много итераций нужно для завершения
параллельного BFS (взвешенный граф)?
• Когда первый раз посетили искомую вершину,
значит найден самый короткий путь
• И это неверно!
BFS Weighted: сложности
s
p
q
r
search frontier
10
n1
n2
n3
n4
n5
n6 n7
n8
n9
1
1
1
1
1
1
1
1
BFS Weighted: критерий завершения
• В худшем случае: N – 1
• В реальном мире ~= диаметру графа
• Практическая реализация
– Итерации завершаются, когда минимальный путь у
каждой вершины больше не меняется
– Для этого можно также использовать счетчики в
MapReduce
PageRank
PageRank
• Определяет важность страницы
• Характеризует кол-во времени, которое
пользователь провел на данной странице
• Модель блуждающего веб-серфера
– Пользователь начинает серфинг на случайной веб-странице
– Пользователь произвольно кликает по ссылкам, тем самым
перемещаясь от страницы к странице
X
t1
t2
tn
…
Вычисление PageRank
• Свойства PageRank’а
– Может быть рассчитан итеративно
– Локальный эффект на каждой итерации
• Набросок алгоритма
– Начать с некоторыми заданными значения PRi
– Каждая страница распределяет PRi “кредит” всем страниц,
на которые с нее есть ссылки
– Каждая страница добавляет весь полученный “кредит” от
страниц, которые на нее ссылаются, для подсчета PRi+1
– Продолжить итерации пока значения не сойдутся
Упрощения для PageRank
Рассмотрим простой случай
– Нет фактора случайного перехода (random jump)
– Нет “подвисших” вершин
n1 (0.2)
n4 (0.2)
n3 (0.2)
n5 (0.2)
n2 (0.2)
0.1
0.1
0.2 0.2
0.1
0.1
0.066 0.066
0.066
n1 (0.066)
n4 (0.3)
n3 (0.166)
n5 (0.3)
n2 (0.166)
Iteration 1
n1 (0.066)
n4 (0.3)
n3 (0.166)
n5 (0.3)
n2 (0.166)
0.033
0.033
0.3 0.166
0.083
0.083
0.1 0.1
0.1
n1 (0.1)
n4 (0.2)
n3 (0.183)
n5 (0.383)
n2 (0.133)
Iteration 2
n5 [n1, n2, n3]n1 [n2, n4] n2 [n3, n5] n3 [n4] n4 [n5]
n2 n4 n3 n5 n1 n2 n3n4 n5
n2 n4n3 n5n1 n2 n3 n4 n5
n5 [n1, n2, n3]n1 [n2, n4] n2 [n3, n5] n3 [n4] n4 [n5]
Map
Reduce
class Mapper
method Map(nid n, node N)
p ← N.PageRank/|N.AdjacencyList|
Emit(nid n,N)
for all nodeid m ∈ N.AdjacencyList do
Emit(nid m, p)
PageRank: Mapper
class Reducer
method Reduce(nid m, [p1, p2, . . .])
M ← ∅
for all p ∈ counts [p1, p2, . . .] do
if IsNode(p) then
M ← p
else
s ← s + p
M.PageRank ← s
Emit(nid m, node M)
PageRank: Reducer
Полный PageRank
• Обработка “подвешенных” вершин
• Случайный переход (random jump)
Сходимость PageRank
• Продолжать итерации пока значения
PageRank не перестанут изменяться
• Продолжать итерации пока отношения
PageRank не перестанут изменяться
• Фиксированное число итераций
Проблемы MapReduce на графах
• Многословность Java
• Время запуска таска в Hadoop
• Медленные или зависшие таски
• Бесполезность фазы shuffle для графов
• Проверки на каждой итерации
• Итеративные алгоритмы на MapReduce
неэффективны!
MapReduce на графах, проблемы
In-Mapper Combining
• Использование комбайнеров
– Агрегирует данные на
mapper
– Но, промежуточные данные
все равно обрабатываются
• In-mapper combining
– Агрегируем сообщения в
буффере
– Но, требуется управление
памятью
setup
map
cleanup
buffer
Emit all key-
value pairs
at once
Улучшение партиционирования
• По-умолчанию: hash partitioning
• Наблюдение: много графов имеют локальную
структуру
– Например, коммьюнити в соц.сетях
– Улучшение локальной агрегации
• Но, партиционирование довольно сложно!
– Иногда простые эвристики помогают
– Для веб-графа: использовать партиционирование на
основе домена от URL
Schimmy Design Pattern
• Обычно два набора данных:
– Messages (актуальные вычисления)
– Graph structure (структура обрабатываемого графа)
• Schimmy: выполнять shuffle только для messages
S TS1 T1 S2 T2 S3 T3
ReducerReducerReducer
S TS1 T1 S2 T2 S3 T3
intermediate data
(messages)
intermediate data
(messages)
intermediate data
(messages)
from HDFS
(graph structure)
from HDFS
(graph structure)
from HDFS
(graph structure)
Обе части (S и T) консистентно партиционированы и сортированы по join key
Эксперимент
• Cluster setup:
– 10 workers, each 2 cores (3.2 GHz Xeon), 4GB RAM, 367 GB disk
– Hadoop 0.20.0 on RHELS 5.3
• Dataset:
– Первый сегмент английского текста из коллекции ClueWeb09
– 50.2m web pages (1.53 TB uncompressed, 247 GB compressed)
– Extracted webgraph: 1.4 Млрд ссылок, 7.0 GB
– Dataset сортирован в порядке краулинга
• Setup:
– Измерялось время выполнения по каждой итерации (5 итераций)
– 100 партиций
“Best Practices”
+18%
1.4b
674m
+18%
-15%
1.4b
674m
+18%
-15%
-60%
1.4b
674m
86m
+18%
-15%
-60%
-69%
1.4b
674m
86m

More Related Content

PDF
06 - Hadoop. Java API и Hadoop Streaming
PDF
13 - Hadoop. Парадигма Spark
PDF
14 - Hadoop. Фреймворк Spark
PDF
09 - Hadoop. Pig
PDF
Лекция 12. Spark
PDF
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
PDF
Apache spark
PDF
Лекция 13. YARN
06 - Hadoop. Java API и Hadoop Streaming
13 - Hadoop. Парадигма Spark
14 - Hadoop. Фреймворк Spark
09 - Hadoop. Pig
Лекция 12. Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
Apache spark
Лекция 13. YARN

What's hot (20)

PDF
Опыт использования Spark, Основано на реальных событиях
PDF
Лекция 10. Apache Mahout
PDF
Spark: нетипичные примеры использования
PDF
Big Data и Ruby
PDF
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
PDF
Лекция 6. MapReduce в Hadoop (графы)
PDF
Лекция 2. Основы Hadoop
PDF
Разработка на Perl под Raspberry PI
PDF
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
PDF
Apache Spark — Егор Пахомов
PDF
ODP
Hacking PostgreSQL. Физическое представление данных
PDF
Расширения для PostgreSQL
PDF
Hacking PostgreSQL. Разделяемая память и блокировки.
PDF
Hadoop presentation
PDF
Hacking PostgreSQL. Обзор исходного кода
PPTX
MyRocks: табличный движок для MySQL на основе RocksDB
PDF
PiterPy#3. DSL in Python. How and why?
PDF
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PDF
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Опыт использования Spark, Основано на реальных событиях
Лекция 10. Apache Mahout
Spark: нетипичные примеры использования
Big Data и Ruby
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
Лекция 6. MapReduce в Hadoop (графы)
Лекция 2. Основы Hadoop
Разработка на Perl под Raspberry PI
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Apache Spark — Егор Пахомов
Hacking PostgreSQL. Физическое представление данных
Расширения для PostgreSQL
Hacking PostgreSQL. Разделяемая память и блокировки.
Hadoop presentation
Hacking PostgreSQL. Обзор исходного кода
MyRocks: табличный движок для MySQL на основе RocksDB
PiterPy#3. DSL in Python. How and why?
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Ad

Similar to 08 - Hadoop. Алгоритмы на графах в MapReduce (20)

PPTX
Big Data - первые шаги
PDF
Big data algorithms and data structures for large scale graphs
PDF
А. Зиновьев "Big data algorithms and data structures for large scale graphs",...
PDF
Параллельные и распределенные вычисления
PPTX
PPTX
алексей романенко
PDF
Лекция 4. MapReduce в Hadoop (введение)
PDF
Uniting Data JavaOne2013
PPTX
Что такое Postgresql (Максим Богук)
PPTX
BigData Week Moscow 2013 - Case: Personalization
PDF
Максим Богук. Postgres-XC
PPTX
Hadoops MapReduce framework explanations
PDF
Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...
PDF
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
PDF
Как сделать веб-карту, сохранить здоровье и возненавидеть IE
PDF
RIT++: Hadoop Streaming: простой путь к масштабированию приложений обработки ...
PDF
Hadoop streaming простой путь к масштабированию приложений обработки данных. ...
PDF
Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...
PDF
Mihail Korepanov
PDF
Всеволод Поляков "История одного мониторинга"
Big Data - первые шаги
Big data algorithms and data structures for large scale graphs
А. Зиновьев "Big data algorithms and data structures for large scale graphs",...
Параллельные и распределенные вычисления
алексей романенко
Лекция 4. MapReduce в Hadoop (введение)
Uniting Data JavaOne2013
Что такое Postgresql (Максим Богук)
BigData Week Moscow 2013 - Case: Personalization
Максим Богук. Postgres-XC
Hadoops MapReduce framework explanations
Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Как сделать веб-карту, сохранить здоровье и возненавидеть IE
RIT++: Hadoop Streaming: простой путь к масштабированию приложений обработки ...
Hadoop streaming простой путь к масштабированию приложений обработки данных. ...
Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...
Mihail Korepanov
Всеволод Поляков "История одного мониторинга"
Ad

More from Roman Brovko (20)

PDF
Individual task Networking
PPTX
Networking essentials lect3
PPTX
Gl embedded starterkit_ethernet
PPTX
Networking essentials lect2
PPTX
Networking essentials lect1
PPTX
Bare metal training_07_spi_flash
PPTX
Bare metal training_06_I2C
PPTX
Glesk worshop
PPTX
Bare metal training_05_uart
PPTX
Bare metal training_04_adc_temp_sensor
PPTX
Bare metal training_03_timers_pwm
PPTX
Bare metal training_02_le_ds_and_buttons
PPTX
Bare metal training_01_hello_world
PPTX
Bare metal training_00_prerequisites
PPTX
C language lect_23_advanced
PPTX
C language lect_22_advanced
PPTX
C language lect_21_advanced
PPTX
подготовка рабочего окружения
PPTX
C language lect_20_advanced
PPTX
C language lect_19_basics
Individual task Networking
Networking essentials lect3
Gl embedded starterkit_ethernet
Networking essentials lect2
Networking essentials lect1
Bare metal training_07_spi_flash
Bare metal training_06_I2C
Glesk worshop
Bare metal training_05_uart
Bare metal training_04_adc_temp_sensor
Bare metal training_03_timers_pwm
Bare metal training_02_le_ds_and_buttons
Bare metal training_01_hello_world
Bare metal training_00_prerequisites
C language lect_23_advanced
C language lect_22_advanced
C language lect_21_advanced
подготовка рабочего окружения
C language lect_20_advanced
C language lect_19_basics

08 - Hadoop. Алгоритмы на графах в MapReduce

  • 2. Граф как структура данных G = (V,E) – V представляет собой множество вершин (nodes) – E представляет собой множество ребер (edges/links) – Ребра и вершины могут содержать дополнительную информацию
  • 3. V = {1, 2, 3, 4, 5, 6} E = {[1,2], [1,4], [1,6], [3,1], … } W1,2 = 3, W1,4 = 2, W1,6 = 7, W3,1 = 8, … 2 1 4 5 3 6 3 2 7 8 4 1 2 1 5 1
  • 10. Структура компьютеров и серверов сети
  • 14. Задачи и проблемы на графах
  • 15. Поиск кратчайшего пути • Роутинг траффика • Навигация маршрута
  • 16. Поиск минимального остовного дерева (Minimum Spanning Tree) • Телекоммуникационные компании
  • 17. Поиск максимального потока (Max Flow) • Структура компьютеров и серверов Интернет
  • 19. Леонард Эйлер Проблема семи мостов Кёнигсберга
  • 21. • Вычисления на каждой вершине • Обход графа
  • 22. Ключевые вопросы: – Как представить граф в MapReduce? – Как обходить граф в MapReduce?
  • 23. Матрица смежности Граф представляется как матрица M размером n x n – n = |V| – Mij = 1 означает наличие ребра между i и j 1 2 3 4 1 0 1 0 1 2 1 0 1 1 3 1 0 0 0 4 1 0 1 0 1 2 3 4
  • 24. Матрица смежности Плюсы – Удобство математических вычислений – Перемещение по строкам и колонкам соответствует переходу по входящим и исходящим ссылкам Минусы – Матрица разреженная, множество лишних нулей – Расходуется много лишнего места 1 2 3 4 1 0 1 0 1 2 1 0 1 1 3 1 0 0 0 4 1 0 1 0
  • 25. Списки смежности Берем матрицу смежности и убираем все нули 1 2 3 4 1 0 1 0 1 2 1 0 1 1 3 1 0 0 0 4 1 0 1 0 1: 2, 4 2: 1, 3, 4 3: 1 4: 1, 3
  • 26. Списки смежности • Плюсы – Намного более компактная реализация – Легко найти все исходящие ссылки для вершины • Минусы – Намного сложнее подсчитать входящие ссылки
  • 34. Алгоритм Дейкстры Dijkstra(V, s, w) for all vertex v ∈ V do d[v] ← ∞ d[s] ← 0 Q ← {V } while Q != ∅ do u ←ExtractMin(Q) for all vertex v ∈ u.AdjacencyList do if d[v] > d[u] + w(u, v) then d[v] ← d[u] + w(u, v)
  • 35. Поиск кратчайшего пути • Пусть веса ребер равны 1 • Решение по индукции: – DISTANCETO(s) = 0 – DISTANCETO(s->p) = 1 – DISTANCETO(n) = 1 + min(DISTANCETO(m), m  M) s m3 m2 m1 n … … … d1 d2 d3
  • 36. Параллельный поиск в ширину (BFS) n0 n3 n2 n1 n7 n6 n5 n4 n9 n8
  • 37. Breadth First Search: представление данных – Key: вершина n – Value: d (расстояние от начала), adjacency list (вершины, доступные из n) – Инициализация: для всех вершин, кроме начальной, d =  1 –> [0, {2, 3, 4}] 2 -> [, {5, 6} ] 3 -> [, {} ] 4 -> [, {7, 8} ] 5 -> [, {9, 10} ] …
  • 38. Breadth First Search: Mapper mapper(key, value): emit(key, value) m  value.adjacency_list: emit (m, value.d + 1)
  • 39. Breadth First Search: Mapper 1 –> [0, {2, 3, 4}] 1 –> [0, {2, 3, 4}] 2 -> [1, {} ] 3 -> [1, {} ] 4 -> [1, {} ] 2 -> [, {5, 6} ] 2 –> [, {5, 6}] 5 -> [, {} ] 6 -> [, {} ] Mapper 1 Mapper 2
  • 40. Breadth First Search: Reducer • Sort/Shuffle – Сгруппировать расстояния по достижимым вершинам • Reducer: – Выбрать путь с минимальным расстоянием для каждой достижимой вершины – Сохранить структуру графа
  • 41. Breadth First Search: Reducer 2 –> {[1, {} ], [, {5, 6}]} 2 –> [1, {5, 6} ] Reduce In: Reduce Out:
  • 42. class Mapper method Map(nid n, node N) d ← N.Distance Emit(nid n,N) // Pass along graph structure for all nodeid m ∈ N.AdjacencyList do Emit(nid m, d + 1) // Emit distances to reachable nodes BFS: псевдокод
  • 43. class Reducer method Reduce(nid m, [d1, d2, . . .]) dmin ← ∞ M ← ∅ for all d ∈ counts [d1, d2, . . .] do if IsNode(d) then M ← d // Recover graph structure else if d < dmin then dmin ← d M.Distance ← dmin // Update shortest distance Emit(nid m, node M) BFS: псевдокод
  • 44. 1 –> [0, {2, 3, 4}] 2 -> [, {5, 6} ] 3 -> [, {} ] 4 -> [, {7, 8} ] 5 -> [, {9, 10} ] … 1 –> [0, {2, 3, 4}] 2 -> [1, {5, 6} ] 3 -> [1, {} ] 4 -> [1, {7, 8} ] 5 -> [, {9, 10} ] … 1 –> [0, {2, 3, 4}] 2 -> [1, {5, 6} ] 3 -> [1, {} ] 4 -> [1, {7, 8} ] 5 -> [2, {9, 10} ] … 1 –> [0, {2, 3, 4}] 2 -> [1, {5, 6} ] 3 -> [1, {} ] 4 -> [1, {7, 8} ] 5 -> [2, {9, 10} ] … Input Iteration 1 Iteration 2Result …
  • 45. Breadth First Search: Итерации • Каждая итерация задачи MapReduce смещает границу продвижения по графу (frontier) на один “hop” – Последующие операции включают все больше и больше посещенных вершин, т.к. граница (frontier) расширяется – Множество итераций требуется для обхода всего графа • Сохранение структуры графа – Проблема: что делать со списком смежных вершин (adjacency list)? – Решение: Mapper также пишет (n, adjacency list)
  • 46. BFS: критерий завершения • Как много итераций нужно для завершения параллельного BFS? • Когда первый раз посетили искомую вершину, значит найден самый короткий путь • Равно диаметру графа • Практическая реализация – Внешняя программа-драйвер для проверки оставшихся вершин с дистанцией  – Можно использовать счетчики из Hadoop MapReduce
  • 47. BFS vs Дейкстра • Алгоритм Дейкстры более эффективен – На каждом шаге используются вершины только из пути с минимальным весом – Нужна дополнительная структура данных (priority queue) • MapReduce обходит все пути графа параллельно – Много лишней работы (brute-force подход) – Полезная часть выполняется только на текущей границе обхода
  • 48. BFS: Weighted Edges • Добавим положительный вес каждому ребру • Простая доработка: добавим вес w для каждого ребра в список смежных вершин – В mapper, emit (m, d + wp) вместо (m, d + 1) для каждой вершины m
  • 49. BFS Weighted: критерий завершения • Как много итераций нужно для завершения параллельного BFS (взвешенный граф)? • Когда первый раз посетили искомую вершину, значит найден самый короткий путь • И это неверно!
  • 50. BFS Weighted: сложности s p q r search frontier 10 n1 n2 n3 n4 n5 n6 n7 n8 n9 1 1 1 1 1 1 1 1
  • 51. BFS Weighted: критерий завершения • В худшем случае: N – 1 • В реальном мире ~= диаметру графа • Практическая реализация – Итерации завершаются, когда минимальный путь у каждой вершины больше не меняется – Для этого можно также использовать счетчики в MapReduce
  • 53. PageRank • Определяет важность страницы • Характеризует кол-во времени, которое пользователь провел на данной странице • Модель блуждающего веб-серфера – Пользователь начинает серфинг на случайной веб-странице – Пользователь произвольно кликает по ссылкам, тем самым перемещаясь от страницы к странице
  • 55. Вычисление PageRank • Свойства PageRank’а – Может быть рассчитан итеративно – Локальный эффект на каждой итерации • Набросок алгоритма – Начать с некоторыми заданными значения PRi – Каждая страница распределяет PRi “кредит” всем страниц, на которые с нее есть ссылки – Каждая страница добавляет весь полученный “кредит” от страниц, которые на нее ссылаются, для подсчета PRi+1 – Продолжить итерации пока значения не сойдутся
  • 56. Упрощения для PageRank Рассмотрим простой случай – Нет фактора случайного перехода (random jump) – Нет “подвисших” вершин
  • 57. n1 (0.2) n4 (0.2) n3 (0.2) n5 (0.2) n2 (0.2) 0.1 0.1 0.2 0.2 0.1 0.1 0.066 0.066 0.066 n1 (0.066) n4 (0.3) n3 (0.166) n5 (0.3) n2 (0.166) Iteration 1
  • 58. n1 (0.066) n4 (0.3) n3 (0.166) n5 (0.3) n2 (0.166) 0.033 0.033 0.3 0.166 0.083 0.083 0.1 0.1 0.1 n1 (0.1) n4 (0.2) n3 (0.183) n5 (0.383) n2 (0.133) Iteration 2
  • 59. n5 [n1, n2, n3]n1 [n2, n4] n2 [n3, n5] n3 [n4] n4 [n5] n2 n4 n3 n5 n1 n2 n3n4 n5 n2 n4n3 n5n1 n2 n3 n4 n5 n5 [n1, n2, n3]n1 [n2, n4] n2 [n3, n5] n3 [n4] n4 [n5] Map Reduce
  • 60. class Mapper method Map(nid n, node N) p ← N.PageRank/|N.AdjacencyList| Emit(nid n,N) for all nodeid m ∈ N.AdjacencyList do Emit(nid m, p) PageRank: Mapper
  • 61. class Reducer method Reduce(nid m, [p1, p2, . . .]) M ← ∅ for all p ∈ counts [p1, p2, . . .] do if IsNode(p) then M ← p else s ← s + p M.PageRank ← s Emit(nid m, node M) PageRank: Reducer
  • 62. Полный PageRank • Обработка “подвешенных” вершин • Случайный переход (random jump)
  • 63. Сходимость PageRank • Продолжать итерации пока значения PageRank не перестанут изменяться • Продолжать итерации пока отношения PageRank не перестанут изменяться • Фиксированное число итераций
  • 65. • Многословность Java • Время запуска таска в Hadoop • Медленные или зависшие таски • Бесполезность фазы shuffle для графов • Проверки на каждой итерации • Итеративные алгоритмы на MapReduce неэффективны! MapReduce на графах, проблемы
  • 66. In-Mapper Combining • Использование комбайнеров – Агрегирует данные на mapper – Но, промежуточные данные все равно обрабатываются • In-mapper combining – Агрегируем сообщения в буффере – Но, требуется управление памятью setup map cleanup buffer Emit all key- value pairs at once
  • 67. Улучшение партиционирования • По-умолчанию: hash partitioning • Наблюдение: много графов имеют локальную структуру – Например, коммьюнити в соц.сетях – Улучшение локальной агрегации • Но, партиционирование довольно сложно! – Иногда простые эвристики помогают – Для веб-графа: использовать партиционирование на основе домена от URL
  • 68. Schimmy Design Pattern • Обычно два набора данных: – Messages (актуальные вычисления) – Graph structure (структура обрабатываемого графа) • Schimmy: выполнять shuffle только для messages S TS1 T1 S2 T2 S3 T3
  • 69. ReducerReducerReducer S TS1 T1 S2 T2 S3 T3 intermediate data (messages) intermediate data (messages) intermediate data (messages) from HDFS (graph structure) from HDFS (graph structure) from HDFS (graph structure) Обе части (S и T) консистентно партиционированы и сортированы по join key
  • 70. Эксперимент • Cluster setup: – 10 workers, each 2 cores (3.2 GHz Xeon), 4GB RAM, 367 GB disk – Hadoop 0.20.0 on RHELS 5.3 • Dataset: – Первый сегмент английского текста из коллекции ClueWeb09 – 50.2m web pages (1.53 TB uncompressed, 247 GB compressed) – Extracted webgraph: 1.4 Млрд ссылок, 7.0 GB – Dataset сортирован в порядке краулинга • Setup: – Измерялось время выполнения по каждой итерации (5 итераций) – 100 партиций