O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
технологии хранения и обработки
больших объёмов данных
Эволюция Map-Reduce. Pregel. Spark.
Дмитрий Барашев
25 апреля 2016
...
Этот материал распространяется под лицензией
Creative Commons
”Attribution - Share Alike” 3.0
http://creativecommons.org/l...
map-reduce и итеративные алгоритмы
• Каждая итерация делает одно и то же
• Процессы надо запускать
• Будут прочитаны все д...
сегодня в программе
Pregel
Apache Spark
GraphX
4/39
pregel – это река
5/39
инфраструктура для алгоритмов на больших
графах
• Идея та же: программист пишет код в рамках
программной модели
• Инфрастр...
действующие лица
• Структуры, хранящие данные о вершинах и
исходящих дугах. Лежат в хранилище (GFS, СУБД)
• Бинарник с пол...
общая модель работы
8/39
состояния вершины
• Активное: работа еще не закончена или есть
входящие сообщения
• Пассивное: входящих сообщений нет,
пол...
состояния вершины
10/39
коммуникация между вершинами
• Вершины могут посылать и принимать сообщения
• Сообщение – это какая-то пользовательская
ст...
пошаговая стратегия
1. Граф делится на N фрагментов, N >> M машин
2. Бинарники стартуют и читают свои фрагменты
3. Мастер ...
во время итерации
Каждый рабочий процесс
1. Выполняет функцию compute() для каждой
вершины из фрагмента и предназначенных ...
вычисление максимального значения
14/39
дополнительные возможности
• Комбайнеры: если сообщения ассоциативные и
коммутативные то перед отсылкой можно
произвести л...
восстановление после сбоев
• Контрольная точка: мастер приказывает
процессам сохранить состояние
• Мастер пингует рабочие ...
вычисление pagerank в pregel
1 class PageRankVertex(Vertex):
2 def compute(self):
3 if self.superstep < 50:
4 self.value =...
другие задачи
• Кратчайшие пути
• Остовное дерево
• Кластеризации
• roll your own...
18/39
дерево кратчайших путей
1 class SSSPVertex(Vertex):
2 def update(self):
3 mindist = 0 if self.is_source() else float(”inf”...
сегодня в программе
Pregel
Apache Spark
GraphX
20/39
недостатки map-reduce
• Плохо подходит для итеративных задач
• Небогатая модель программирования
• Нет интерактивного режи...
apache spark
• Среда выполнения параллельных
распределённых вычислений
• Более богатая модель программирования и
выполнени...
основные действующие лица
• Кластер из нескольких машин
• Выделенная машина-мастер
• Пользовательская программа-«драйвер»
...
жизненный цикл программы
• Локальный запуск драйвера, подготовка
конвейера
• Общение с мастером, рассылка кода конвейера и...
основные концепции
• Эластичный распределенный массив aka resilient
distributed dataset (RDD) содержит в себе какой-то
мас...
wordcount
rdd_dataset = sc.textFile(”dataset/*/*”)
rdd_words = rdd_dataset.flatMap(
lambda line: line.split())
rdd_mapper_...
основные трансформации
• map, flatMap – отображают объект в
объект/последовательность
• filter, sample, distinct – возвращ...
основные действия
• collect, first, take – возвращают драйверу
весь массив или его часть
• count, countByKey – возвращают ...
локальное и глобальное состояние
Что произойдет при выполнении этого кода?
counter = 0
data = range(1, 10)
rdd = sc.parall...
глобальные аккумуляторы
counter = sc.accumulator(0)
data = range(1, 10)
rdd = sc.parallelize(data)
rdd.foreach(lambda x : ...
глобальные рассылки
data = range(1, 10)
rdd = sc.parallelize(data)
bcast = sc.broadcast(2)
rdd.reduce(lambda x, y : x+y+bc...
сегодня в программе
Pregel
Apache Spark
GraphX
32/39
расширение spark для работы с графами
• Добавляет типы данных: направленный
мультиграф с пользовательскими объектами в
вер...
конструирование графа
val users: RDD[(VertexId, (String, String))] =
sc.parallelize(Array((3L, (”rxin”, ”student”)),
(7L, ...
конструирование графа
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 ” ...
более сложные операции
• mapEdges, mapVertices, mapTriplets –
отображения
• aggregateMessages – урезанный вариант
итерации...
хардкор
• pregel – запускает pregel
• pagerank – считает pagerank :)
39/39
Próximos SlideShares
Carregando em…5
×

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

389 visualizações

Publicada em

Эволюция алгоритмов map-reduce. Подсчет page rank с использованием графовой модели вычислений, продукт Apache Spark и его возможности

  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

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

  1. 1. технологии хранения и обработки больших объёмов данных Эволюция Map-Reduce. Pregel. Spark. Дмитрий Барашев 25 апреля 2016 Computer Science Center
  2. 2. Этот материал распространяется под лицензией Creative Commons ”Attribution - Share Alike” 3.0 http://creativecommons.org/licenses/by-sa/3.0/us/deed.ru сверстано в онлайн LATEX редакторе P a peeriapapeeria.com
  3. 3. map-reduce и итеративные алгоритмы • Каждая итерация делает одно и то же • Процессы надо запускать • Будут прочитаны все данные, даже если поменяется только малая часть • Вероятно, будут записаны все данные 3/39
  4. 4. сегодня в программе Pregel Apache Spark GraphX 4/39
  5. 5. pregel – это река 5/39
  6. 6. инфраструктура для алгоритмов на больших графах • Идея та же: программист пишет код в рамках программной модели • Инфраструктура заботится о координации, масштабировании, пересылке сообщений, восстановлении после сбоев • Процесс итеративный • Надо обработать быстрее или больше данных – добавляем машин 6/39
  7. 7. действующие лица • Структуры, хранящие данные о вершинах и исходящих дугах. Лежат в хранилище (GFS, СУБД) • Бинарник с пользовательским кодом, выполняющийся на машинах в кластере • Мастер – один из бинарников, координирующий действия остальных 7/39
  8. 8. общая модель работы 8/39
  9. 9. состояния вершины • Активное: работа еще не закончена или есть входящие сообщения • Пассивное: входящих сообщений нет, пользовательский код считает что работа закончена • Пользовательское значение: какая-то изменяемая структура 9/39
  10. 10. состояния вершины 10/39
  11. 11. коммуникация между вершинами • Вершины могут посылать и принимать сообщения • Сообщение – это какая-то пользовательская структура 11/39
  12. 12. пошаговая стратегия 1. Граф делится на N фрагментов, N >> M машин 2. Бинарники стартуют и читают свои фрагменты 3. Мастер приказывает выполнить итерацию (superstep). 4. Рабочие процессы делают работу, голосуют за остановку и рассылают сообщения 5. Если все вершины остановлены то работа завершена 6. GOTO 3 12/39
  13. 13. во время итерации Каждый рабочий процесс 1. Выполняет функцию compute() для каждой вершины из фрагмента и предназначенных ей сообщений из предыдущей итерации 2. Посылает и принимает сообщения текущей итерации 3. Изменяет значение в вершине и исходящих дугах 4. «Деактивирует» вершины, где работа закончена 13/39
  14. 14. вычисление максимального значения 14/39
  15. 15. дополнительные возможности • Комбайнеры: если сообщения ассоциативные и коммутативные то перед отсылкой можно произвести локальную редукцию • Агрегаторы • вершина предоставляет датчик • рабочий процесс агрегирует значения датчиков по своим вершинам • мастер агрегирует значения по рабочим процессам и предоставляет результат всем вершинам 15/39
  16. 16. восстановление после сбоев • Контрольная точка: мастер приказывает процессам сохранить состояние • Мастер пингует рабочие процессы • Если процесс помирает, его фрагменты передаются другим • Все читают состояние, сохраненное из последней контрольной точки • Несколько последних итераций, возможно, будут повторены 16/39
  17. 17. вычисление 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
  18. 18. другие задачи • Кратчайшие пути • Остовное дерево • Кластеризации • roll your own... 18/39
  19. 19. дерево кратчайших путей 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 = dist 7 if mindist < self.value: 8 self.value = mindist 9 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
  20. 20. сегодня в программе Pregel Apache Spark GraphX 20/39
  21. 21. недостатки map-reduce • Плохо подходит для итеративных задач • Небогатая модель программирования • Нет интерактивного режима 21/39
  22. 22. apache spark • Среда выполнения параллельных распределённых вычислений • Более богатая модель программирования и выполнения • «реляционные» операции в явном виде • сохранение результата в памяти или на диске • явное указание степени параллелизма • Конвейер задается одной программой • Конвейер самовылечивается в случае падения части кластера 22/39
  23. 23. основные действующие лица • Кластер из нескольких машин • Выделенная машина-мастер • Пользовательская программа-«драйвер» 23/39
  24. 24. жизненный цикл программы • Локальный запуск драйвера, подготовка конвейера • Общение с мастером, рассылка кода конвейера и плана выполнения кластеру • Распределённое выполнение конвейера • Отсылка результатов обратно драйверу 24/39
  25. 25. основные концепции • Эластичный распределенный массив aka resilient distributed dataset (RDD) содержит в себе какой-то массив данных • Трансформация применяет операцию к RDD-операндам и производит новый RDD • трансформации «ленивы», они начинают действовать только когда припрёт • Действие тоже применяет операцию, но записывает свой результат на диск или возвращает его драйверу • действие обычно завершает конвейер трансформаций 25/39
  26. 26. 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
  27. 27. основные трансформации • map, flatMap – отображают объект в объект/последовательность • filter, sample, distinct – возвращают подмножество • union, intersection – теоретико-множественные бинарные операции • groupByKey, reduceByKey, aggregateByKey – вариации свертки • join, cartesian – соединение и декартово произведение 27/39
  28. 28. основные действия • collect, first, take – возвращают драйверу весь массив или его часть • count, countByKey – возвращают драйверу количество элементов • reduce, foreach – выполняют функцию над элементами массива • saveAsTextFile, saveAsSequenceFile – записывают массив на диск 28/39
  29. 29. локальное и глобальное состояние Что произойдет при выполнении этого кода? counter = 0 data = range(1, 10) rdd = sc.parallelize(data) def inc(x): global counter counter += x rdd.foreach(inc) print(”Counter value: ”, counter) 29/39
  30. 30. глобальные аккумуляторы 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
  31. 31. глобальные рассылки 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
  32. 32. сегодня в программе Pregel Apache Spark GraphX 32/39
  33. 33. расширение spark для работы с графами • Добавляет типы данных: направленный мультиграф с пользовательскими объектами в вершинах и дугах • Вершины и дуги могут образовывать RDD • Граф определяет новые операции с RDD 33/39
  34. 34. конструирование графа 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. 35. конструирование графа 35/39
  36. 36. обычные операции с вершинами и дугами graph.vertices.filter { case (id, (name, pos)) => pos == ”prof” }.count 36/39
  37. 37. простые графовые операции Триплеты 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
  38. 38. более сложные операции • mapEdges, mapVertices, mapTriplets – отображения • aggregateMessages – урезанный вариант итерации pregel • применяет функцию sendMsg к триплету, опционально посылая сообщение в вершину назначения • применяет функцию mergeMsg в каждой вершине с входящими сообщениями 38/39
  39. 39. хардкор • pregel – запускает pregel • pagerank – считает pagerank :) 39/39

×