39
технологии хранения и обработки больших объёмов данных Эволюция Map-Reduce. Pregel. Spark. Дмитрий Барашев 25 апреля 2016 Computer Science Center

Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

Embed Size (px)

Citation preview

Page 1: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

технологии хранения и обработкибольших объёмов данныхЭволюция Map-Reduce. Pregel. Spark.

Дмитрий Барашев25 апреля 2016

Computer Science Center

Page 2: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

Этот материал распространяется под лицензией

Creative Commons”Attribution - Share Alike” 3.0

http://creativecommons.org/licenses/by-sa/3.0/us/deed.ru

сверстано в онлайн LATEX редакторе

P

a

peeriapapeeria.com

Page 3: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

map-reduce и итеративные алгоритмы

• Каждая итерация делает одно и то же• Процессы надо запускать• Будут прочитаны все данные, даже еслипоменяется только малая часть

• Вероятно, будут записаны все данные

3/39

Page 4: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

сегодня в программе

Pregel

Apache Spark

GraphX

4/39

Page 5: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

pregel – это река

5/39

Page 6: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

инфраструктура для алгоритмов на большихграфах

• Идея та же: программист пишет код в рамкахпрограммной модели

• Инфраструктура заботится о координации,масштабировании, пересылке сообщений,восстановлении после сбоев

• Процесс итеративный• Надо обработать быстрее или больше данных –добавляем машин

6/39

Page 7: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

действующие лица

• Структуры, хранящие данные о вершинах иисходящих дугах. Лежат в хранилище (GFS, СУБД)

• Бинарник с пользовательским кодом,выполняющийся на машинах в кластере

• Мастер – один из бинарников, координирующийдействия остальных

7/39

Page 8: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

общая модель работы

8/39

Page 9: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

состояния вершины

• Активное: работа еще не закончена или естьвходящие сообщения

• Пассивное: входящих сообщений нет,пользовательский код считает что работазакончена

• Пользовательское значение: какая-то изменяемаяструктура

9/39

Page 10: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

состояния вершины

10/39

Page 11: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

коммуникация между вершинами

• Вершины могут посылать и принимать сообщения• Сообщение – это какая-то пользовательскаяструктура

11/39

Page 12: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

пошаговая стратегия

1. Граф делится на N фрагментов, N >> M машин2. Бинарники стартуют и читают свои фрагменты

3. Мастер приказывает выполнить итерацию(superstep).

4. Рабочие процессы делают работу, голосуют заостановку и рассылают сообщения

5. Если все вершины остановлены то работазавершена

6. GOTO 3

12/39

Page 13: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

во время итерации

Каждый рабочий процесс

1. Выполняет функцию compute() для каждойвершины из фрагмента и предназначенных ейсообщений из предыдущей итерации

2. Посылает и принимает сообщения текущейитерации

3. Изменяет значение в вершине и исходящих дугах4. «Деактивирует» вершины, где работа закончена

13/39

Page 14: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

вычисление максимального значения

14/39

Page 15: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

дополнительные возможности

• Комбайнеры: если сообщения ассоциативные икоммутативные то перед отсылкой можнопроизвести локальную редукцию

• Агрегаторы• вершина предоставляет датчик• рабочий процесс агрегирует значения датчиковпо своим вершинам

• мастер агрегирует значения по рабочимпроцессам и предоставляет результат всемвершинам

15/39

Page 16: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

восстановление после сбоев

• Контрольная точка: мастер приказываетпроцессам сохранить состояние

• Мастер пингует рабочие процессы• Если процесс помирает, его фрагментыпередаются другим

• Все читают состояние, сохраненное из последнейконтрольной точки

• Несколько последних итераций, возможно, будутповторены

16/39

Page 17: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

вычисление 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

Page 18: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

другие задачи

• Кратчайшие пути• Остовное дерево• Кластеризации• roll your own...

18/39

Page 19: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

дерево кратчайших путей

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

Page 20: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

сегодня в программе

Pregel

Apache Spark

GraphX

20/39

Page 21: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

недостатки map-reduce

• Плохо подходит для итеративных задач• Небогатая модель программирования• Нет интерактивного режима

21/39

Page 22: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

apache spark

• Среда выполнения параллельныхраспределённых вычислений

• Более богатая модель программирования ивыполнения• «реляционные» операции в явном виде• сохранение результата в памяти или на диске• явное указание степени параллелизма

• Конвейер задается одной программой• Конвейер самовылечивается в случае падениячасти кластера

22/39

Page 23: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

основные действующие лица

• Кластер из нескольких машин• Выделенная машина-мастер• Пользовательская программа-«драйвер»

23/39

Page 24: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

жизненный цикл программы

• Локальный запуск драйвера, подготовкаконвейера

• Общение с мастером, рассылка кода конвейера иплана выполнения кластеру

• Распределённое выполнение конвейера• Отсылка результатов обратно драйверу

24/39

Page 25: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

основные концепции

• Эластичный распределенный массив aka resilientdistributed dataset (RDD) содержит в себе какой-томассив данных

• Трансформация применяет операцию кRDD-операндам и производит новый RDD• трансформации «ленивы», они начинаютдействовать только когда припрёт

• Действие тоже применяет операцию, нозаписывает свой результат на диск иливозвращает его драйверу• действие обычно завершает конвейертрансформаций

25/39

Page 26: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

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

Page 27: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

основные трансформации

• map, flatMap – отображают объект вобъект/последовательность

• filter, sample, distinct – возвращаютподмножество

• union, intersection –теоретико-множественные бинарные операции

• groupByKey, reduceByKey, aggregateByKey –вариации свертки

• join, cartesian – соединение и декартовопроизведение

27/39

Page 28: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

основные действия

• collect, first, take – возвращают драйверувесь массив или его часть

• count, countByKey – возвращают драйверуколичество элементов

• reduce, foreach – выполняют функцию надэлементами массива

• saveAsTextFile, saveAsSequenceFile –записывают массив на диск

28/39

Page 29: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

локальное и глобальное состояние

Что произойдет при выполнении этого кода?

counter = 0data = range(1, 10)rdd = sc.parallelize(data)

def inc(x):global countercounter += x

rdd.foreach(inc)

print(”Counter value: ”, counter)29/39

Page 30: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

глобальные аккумуляторы

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

Page 31: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

глобальные рассылки

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

Page 32: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

сегодня в программе

Pregel

Apache Spark

GraphX

32/39

Page 33: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

расширение spark для работы с графами

• Добавляет типы данных: направленныймультиграф с пользовательскими объектами ввершинах и дугах

• Вершины и дуги могут образовывать RDD• Граф определяет новые операции с RDD

33/39

Page 34: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

конструирование графа

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

Page 35: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

конструирование графа

35/39

Page 36: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

обычные операции с вершинами и дугами

graph.vertices.filter {case (id, (name, pos)) => pos == ”prof”

}.count

36/39

Page 37: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

простые графовые операции

Триплеты

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

Page 38: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

более сложные операции

• mapEdges, mapVertices, mapTriplets –отображения

• aggregateMessages – урезанный вариантитерации pregel• применяет функцию sendMsg к триплету,опционально посылая сообщение в вершинуназначения

• применяет функцию mergeMsg в каждой вершинес входящими сообщениями

38/39

Page 39: Технологии хранения и обработки больших объёмов данных, весна 2016: Pregel, Spark, алгоритмы на графах

хардкор

• pregel – запускает pregel• pagerank – считает pagerank :)

39/39