Upload
cs-center
View
302
Download
0
Embed Size (px)
Citation preview
технологии хранения и обработкибольших объёмов данныхЭволюция Map-Reduce. Pregel. Spark.
Дмитрий Барашев25 апреля 2016
Computer Science Center
Этот материал распространяется под лицензией
Creative Commons”Attribution - Share Alike” 3.0
http://creativecommons.org/licenses/by-sa/3.0/us/deed.ru
сверстано в онлайн LATEX редакторе
P
a
peeriapapeeria.com
map-reduce и итеративные алгоритмы
• Каждая итерация делает одно и то же• Процессы надо запускать• Будут прочитаны все данные, даже еслипоменяется только малая часть
• Вероятно, будут записаны все данные
3/39
сегодня в программе
Pregel
Apache Spark
GraphX
4/39
pregel – это река
5/39
инфраструктура для алгоритмов на большихграфах
• Идея та же: программист пишет код в рамкахпрограммной модели
• Инфраструктура заботится о координации,масштабировании, пересылке сообщений,восстановлении после сбоев
• Процесс итеративный• Надо обработать быстрее или больше данных –добавляем машин
6/39
действующие лица
• Структуры, хранящие данные о вершинах иисходящих дугах. Лежат в хранилище (GFS, СУБД)
• Бинарник с пользовательским кодом,выполняющийся на машинах в кластере
• Мастер – один из бинарников, координирующийдействия остальных
7/39
общая модель работы
8/39
состояния вершины
• Активное: работа еще не закончена или естьвходящие сообщения
• Пассивное: входящих сообщений нет,пользовательский код считает что работазакончена
• Пользовательское значение: какая-то изменяемаяструктура
9/39
состояния вершины
10/39
коммуникация между вершинами
• Вершины могут посылать и принимать сообщения• Сообщение – это какая-то пользовательскаяструктура
11/39
пошаговая стратегия
1. Граф делится на N фрагментов, N >> M машин2. Бинарники стартуют и читают свои фрагменты
3. Мастер приказывает выполнить итерацию(superstep).
4. Рабочие процессы делают работу, голосуют заостановку и рассылают сообщения
5. Если все вершины остановлены то работазавершена
6. GOTO 3
12/39
во время итерации
Каждый рабочий процесс
1. Выполняет функцию compute() для каждойвершины из фрагмента и предназначенных ейсообщений из предыдущей итерации
2. Посылает и принимает сообщения текущейитерации
3. Изменяет значение в вершине и исходящих дугах4. «Деактивирует» вершины, где работа закончена
13/39
вычисление максимального значения
14/39
дополнительные возможности
• Комбайнеры: если сообщения ассоциативные икоммутативные то перед отсылкой можнопроизвести локальную редукцию
• Агрегаторы• вершина предоставляет датчик• рабочий процесс агрегирует значения датчиковпо своим вершинам
• мастер агрегирует значения по рабочимпроцессам и предоставляет результат всемвершинам
15/39
восстановление после сбоев
• Контрольная точка: мастер приказываетпроцессам сохранить состояние
• Мастер пингует рабочие процессы• Если процесс помирает, его фрагментыпередаются другим
• Все читают состояние, сохраненное из последнейконтрольной точки
• Несколько последних итераций, возможно, будутповторены
16/39
вычисление pagerank в pregel
1 class PageRankVertex(Vertex):2 def compute(self):3 if self.superstep < 50:4 self.value = 0.15 / num_vertices + 0.85*sum(5 [pagerank for (vertex,pagerank) in self.
incoming_messages])6 outgoing_pagerank = self.value / len(self.
out_vertices)7 self.outgoing_messages =8 [(vertex,outgoing_pagerank) for vertex in self.
out_vertices]9 else:
10 self.active = False
17/39
другие задачи
• Кратчайшие пути• Остовное дерево• Кластеризации• roll your own...
18/39
дерево кратчайших путей
1 class SSSPVertex(Vertex):2 def update(self):3 mindist = 0 if self.is_source() else float(”inf”)4 for (vertex,dist) in self.incoming_messages:5 if mindist > dist:6 mindist = dist7 if mindist < self.value:8 self.value = mindist9 self.outgoing_messages = [(vertex, mindist + 1)
10 for vertex in self.out_vertices]11 else:12 self.active = True if mindist == float(”inf”)
else False
19/39
сегодня в программе
Pregel
Apache Spark
GraphX
20/39
недостатки map-reduce
• Плохо подходит для итеративных задач• Небогатая модель программирования• Нет интерактивного режима
21/39
apache spark
• Среда выполнения параллельныхраспределённых вычислений
• Более богатая модель программирования ивыполнения• «реляционные» операции в явном виде• сохранение результата в памяти или на диске• явное указание степени параллелизма
• Конвейер задается одной программой• Конвейер самовылечивается в случае падениячасти кластера
22/39
основные действующие лица
• Кластер из нескольких машин• Выделенная машина-мастер• Пользовательская программа-«драйвер»
23/39
жизненный цикл программы
• Локальный запуск драйвера, подготовкаконвейера
• Общение с мастером, рассылка кода конвейера иплана выполнения кластеру
• Распределённое выполнение конвейера• Отсылка результатов обратно драйверу
24/39
основные концепции
• Эластичный распределенный массив aka resilientdistributed dataset (RDD) содержит в себе какой-томассив данных
• Трансформация применяет операцию кRDD-операндам и производит новый RDD• трансформации «ленивы», они начинаютдействовать только когда припрёт
• Действие тоже применяет операцию, нозаписывает свой результат на диск иливозвращает его драйверу• действие обычно завершает конвейертрансформаций
25/39
wordcount
rdd_dataset = sc.textFile(”dataset/*/*”)rdd_words = rdd_dataset.flatMap(
lambda line: line.split())rdd_mapper_output = rdd_words.map(
lambda w : (w, 1))rdd_reducer_output = rdd_mapper_output.reduceByKey(
lambda a, b: a+b)rdd_reducer_output.saveAsTextFile(”/tmp/out”)
26/39
основные трансформации
• map, flatMap – отображают объект вобъект/последовательность
• filter, sample, distinct – возвращаютподмножество
• union, intersection –теоретико-множественные бинарные операции
• groupByKey, reduceByKey, aggregateByKey –вариации свертки
• join, cartesian – соединение и декартовопроизведение
27/39
основные действия
• collect, first, take – возвращают драйверувесь массив или его часть
• count, countByKey – возвращают драйверуколичество элементов
• reduce, foreach – выполняют функцию надэлементами массива
• saveAsTextFile, saveAsSequenceFile –записывают массив на диск
28/39
локальное и глобальное состояние
Что произойдет при выполнении этого кода?
counter = 0data = range(1, 10)rdd = sc.parallelize(data)
def inc(x):global countercounter += x
rdd.foreach(inc)
print(”Counter value: ”, counter)29/39
глобальные аккумуляторы
counter = sc.accumulator(0)data = range(1, 10)rdd = sc.parallelize(data)rdd.foreach(lambda x : counter.add(x))
print(”Counter value: ”, counter.value)
30/39
глобальные рассылки
data = range(1, 10)rdd = sc.parallelize(data)
bcast = sc.broadcast(2)rdd.reduce(lambda x, y : x+y+bcast.value)bcast2 = sc.broadcast(4)rdd.reduce(lambda x, y : x+y+bcast2.value)
31/39
сегодня в программе
Pregel
Apache Spark
GraphX
32/39
расширение spark для работы с графами
• Добавляет типы данных: направленныймультиграф с пользовательскими объектами ввершинах и дугах
• Вершины и дуги могут образовывать RDD• Граф определяет новые операции с RDD
33/39
конструирование графа
val users: RDD[(VertexId, (String, String))] =sc.parallelize(Array((3L, (”rxin”, ”student”)),
(7L, (”jgonzal”, ”postdoc”)), (5L, (”franklin”, ”prof”)),(2L, (”istoica”, ”prof”))))
val relationships: RDD[Edge[String]] =sc.parallelize(Array(
Edge(3L, 7L, ”collab”), Edge(5L, 3L, ”advisor”),Edge(2L, 5L, ”colleague”), Edge(5L, 7L, ”pi”)))
val defaultUser = (”John Doe”, ”Missing”)
val graph = Graph(users, relationships, defaultUser)
34/39
конструирование графа
35/39
обычные операции с вершинами и дугами
graph.vertices.filter {case (id, (name, pos)) => pos == ”prof”
}.count
36/39
простые графовые операции
Триплеты
val facts: RDD[String] =graph.triplets.map(triplet =>
triplet.srcAttr._1 + ” is the ” +triplet.attr + ” of ” + triplet.dstAttr._1)
facts.collect.foreach(println(_))
Число входящих дуг
graph.inDegrees
37/39
более сложные операции
• mapEdges, mapVertices, mapTriplets –отображения
• aggregateMessages – урезанный вариантитерации pregel• применяет функцию sendMsg к триплету,опционально посылая сообщение в вершинуназначения
• применяет функцию mergeMsg в каждой вершинес входящими сообщениями
38/39
хардкор
• pregel – запускает pregel• pagerank – считает pagerank :)
39/39