SlideShare a Scribd company logo
1 of 51
Download to read offline
Методы распределенной обработки
больших объемов данных в Hadoop
Москва 2014
Лекция 12: Spark
Мотивация
• MapReduce отлично упрощает анализ big
data на больших, но ненадежных, кластерах
• Но с ростом популярности фреймворка
пользователи хотят большего:
– Итеративных задач, например, алгоритмы
machine learning
– Интерактивной аналитики
Мотивация
• Для решения обоих типов проблем требуются
одна вещь, которой нет в MapReduce…
– Эффективных примитивов для общих данных
(Efficient primitives for data sharing)
• В MapReduce единственный способ для обмена
данными между задачами (jobs), это надежное
хранилище (stable storage)
• Репликация также замедляет систему, но это
необходимо для обеспечения fault tolerance
Решение
In-Memory Data Processing and
Sharing
Пример
Input Iter 1
HDFS
Read
HDFS
Write
Iter 1
HDFS
Read
HDFS
Write
HDFS
Read
Input Iter 1
HDFS
Read
Iter 1RAM RAM
Пример
Input
Query 1 Result 1
Query 1 Result 1
Query 1 Result 1
Пример
Query 1 Result 1
Query 1 Result 1
Query 1 Result 1
Input RAM
• Задача
– Разработать дизайн абстракции распределенной
памяти с поддержкой fault tolerant и
эффективности
• Решение
– Resilient Distributed Datasets (RDD)
RDD
• Абстрактное представление распределенной
RAM
• Immutable коллекция объектов
распределенных по всему кластеру
• RDD делится на партиции, которые являются
атомарными частями информации
• Партиции RDD могут хранится на различных
нодах кластера
Программная модель Spark
• Основана на parallelizable operators
• Эти операторы являются функциями
высокого порядка, которые выполняют user-
defined функции параллельно
• Поток обработки данных состоит из любого
числа data sources, operators и data sinks
путем соединения их inputs и outputs
Программная модель Spark
• Задача описывается с помощью directed
acyclic graphs (DAG)
Higher-Order Functions
• Higher-order functions: RDD операторы
• Существует два типа операторов
– transformations и actions
• Transformations: lazy-операторы, которые
создают новые RDD
• Actions: запускают вычисления и
возвращают результат в программу или
пишут данные во внешнее хранилище
Higher-Order Functions
RDD Transformations - Map
• Все пары обрабатываются
независимо
// passing each element through a function.
val nums = sc.parallelize(Array(1, 2, 3))
val squares = nums.map(x => x * x) // {1, 4, 9}
// selecting those elements that func returns true.
val even = squares.filter(x => x % 2 == 0) // {4}
// mapping each element to zero or more others.
nums.flatMap(x => Range(0, x, 1)) // {0, 0, 1, 0, 1, 2}
RDD Transformations - Reduce
• Пары с одинаковыми ключами
группируются
• Группы обрабатываются независимо
val pets = sc.parallelize(Seq(("cat", 1), ("dog", 1), ("cat", 2)))
pets.reduceByKey((x, y) => x + y)
// {(cat, 3), (dog, 1)}
pets.groupByKey()
// {(cat, (1, 2)), (dog, (1))}
RDD Transformations - Join
• Выполняется equi-join по ключу
• Join-кандидаты обрабатываются
независимо
val visits = sc.parallelize(Seq(("index.html", "1.2.3.4"),
("about.html", "3.4.5.6"),
("index.html", "1.3.3.1")))
val pageNames = sc.parallelize(Seq(("index.html", "Home"),
("about.html", "About")))
visits.join(pageNames)
// ("index.html", ("1.2.3.4", "Home"))
// ("index.html", ("1.3.3.1", "Home"))
// ("about.html", ("3.4.5.6", "About"))
RDD Transformations - CoGroup
• Каждый input группируется по ключу
• Группы с одинаковыми ключами
обрабатываются вместе
val visits = sc.parallelize(Seq(("index.html", "1.2.3.4"),
("about.html", "3.4.5.6"),
("index.html", "1.3.3.1")))
val pageNames = sc.parallelize(Seq(("index.html", "Home"),
("about.html", "About")))
visits.cogroup(pageNames)
// ("index.html", (("1.2.3.4", "1.3.3.1"), ("Home")))
// ("about.html", (("3.4.5.6"), ("About")))
RDD Transformations - Union и Sample
• Union: объединяет два RDD и возвращает
один RDD используя bag-семантику, т.е.
дубликаты не удаляются
• Sample: похоже на map, за исключением
того, что RDD сохраняет seed для генератора
произвольных чисел для каждой партии
чтобы детермировано выбирать сэмпл
записей
RDD Actions
• Возвращает все элементы RDD в виде массива
val nums = sc.parallelize(Array(1, 2, 3))
nums.collect() // Array(1, 2, 3)
• Возвращает массив с первыми n элементами RDD
nums.take(2) // Array(1, 2)
• Возвращает число элементов в RDD
nums.count() // 3
RDD Actions
• Агрегирует элементы RDD используя заданную функцию
nums.reduce((x, y) => x + y)
// или
nums.reduce(_ + _) // 6
• Записывает элементы RDD в виде текстового файла
nums.saveAsTextFile("hdfs://file.txt")
SparkContext
• Основная точка входа для работы со Spark
• Доступна в shell как переменная sc
• В standalone-программах необходимо
создавать отдельно
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
val sc = new SparkContext(master, appName, [sparkHome], [jars])
local
local[k]
spark://host:port
mesos://host:port
Создание RDD
• Преобразовать коллекцию в RDD
val a = sc.parallelize(Array(1, 2, 3))
• Загрузить текст из локальной FS, HDFS или S3
val a = sc.textFile("file.txt")
val b = sc.textFile("directory/*.txt")
val c = sc.textFile("hdfs://namenode:9000/path/file")
Пример
• Посчитать число строк содержащих MAIL
val file = sc.textFile("hdfs://...")
val sics = file.filter(_.contains("MAIL")) // transformation
val cached = sics.cache()
val ones = cached.map(_ => 1) // transformation
val count = ones.reduce(_+_) // action
val file = sc.textFile("hdfs://...")
val count = file.filter(_.contains(“MAIL")).count()
transformation action
Shared Variables
• Когда Spark запускает выполнение функции
параллельно как набор тасков на различных
нодах, то отправляется копия каждой
переменной, используемой в функции, на
каждый таск
• Иногда нужно, чтобы переменная была
общая между тасками или между тасками
программой-драйвером
Shared Variables
• Обновления переменных не распространяются
обратно в программу-драйвер
• Использование обычных read-write общих
переменные между тасками неэффективно
– К примеру, необходимо отправить на каждую ноду
большой датасет
• Есть два типа shared variables
– broadcast variables
– accumulators
Shared Variables: Broadcast Variables
• Read-only переменные кешируются на
каждой машине вместо того, чтобы
отправлять копию на каждый таск
• Broadcast Variables не отсылаются на ноду
больше одного раза
scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar: spark.Broadcast[Array[Int]] = spark.Broadcast(b5c40191-...)
scala> broadcastVar.value
res0: Array[Int] = Array(1, 2, 3)
Shared Variables: Accumulators
• Могут быть только добавлены
• Могут использоваться для реализации
счетчиков и сумматоров
• Таски, работающие на кластере, могут затем
добавлять значение используя оператор +=
scala> val accum = sc.accumulator(0)
accum: spark.Accumulator[Int] = 0
scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x)
...
scala> accum.value
res2: Int = 10
Apache Spark Engine
• Lightning-fast cluster computing!
• Apache Spark – быстрый и многоцелевой
«движок» для обработки больших объемов
данных
• Предоставляет программный интерфейс на
Scala
• Каждый RDD является объектов в Spark
Apache Spark
• Скорость
– Работает быстрее чем Hadoop MapReduce в
100 раз, если данные в памяти, и в 10 раз,
если данные на диске
• В Spark есть продвинутый DAG-механизм
выполнения задач, которые поддерживает
cyclic data flow и in-memory computing
• Легкость использования
– Просто писать приложения на Java, Scala и
Python
• Более 80 высокоуровневых операторов для
построения параллельных приложений
• Их можно использовать интерактивно в shell
на Scala и Python
Apache Spark
• Обобщенность
– Комбинирование SQL, streaming и
комплексной аналитики в рамках
одного приложения
• Spark SQL, Mlib, GraphX и Spark Streaming
• Работает везде
– Hadoop, Mesos, standalone или в
облаке
– Доступ к данных из различных
источников, включая HDFS, Cassandra,
HBase, S3
• https://spark.apache.org/
Программный интерфейс Spark
• Приложение на Spark состоит из программы-
драйвера, которая запускает пользовательскую
функцию main и выполняет различные
операции параллельно на кластере
Lineage
• Lineage: это transformations,
используемые для построения RDD
• RDD сохраняются как цепочка
объектов, охватывающих весь
lineage каждого RDD
val file = sc.textFile("hdfs://...")
val mail = file.filter(_.contains("MAIL"))
val cached = mail.cache()
val ones = cached.map(_ => 1)
val count = ones.reduce(_+_)
Dependencies RDD
• Два типа зависимостей между RDD
– Narrow
– Wide
Dependencies RDD: Narrow
• Narrow: каждая партиция
родительского RDD
используется как минимум в
одной дочерней партиции RDD
• Narrow dependencies позволяют
выполнять pipelined execution
на одной ноде кластера:
– Напр., фильтр следуемый за Map
Dependencies RDD: Wide
• Wide: каждая партиция
родительского RDD
используется в
множестве дочерних
партиций RDD
Job Scheduling
• Когда пользователь
запускает action на RDD
шедулер строит DAG из
stages графа RDD lineage
• Stage содержит различные
pipelined transformations c
narrow dependencies
• Граница для stage
– Shuffles для wide
dependencies
– Уже обработанные партиции
Job Scheduling
• Шедулер запускает таски
для обработки оставшихся
партиций (missing partitions)
из каждой stage пока не
обработается целевая
(target) RDD
• Таски назначаются машинам
на основе локальности
– Если таску требуется
партиция, которая доступна в
памяти на ноде, то таск
отправляется на эту ноду
RDD Fault Tolerance
• RDD поддерживает информацию о lineage,
которая может быть использована для
восстановления потерянных партиций
• Логгирование lineage
• Отсутсвие репликации
• Пересчет только потерянных партиций (lost
partitions) RDD
RDD Fault Tolerance
• Промежуточные результаты из wide
dependencies материлизуются на нодах,
отвечающих за родительские партиции (для
упрощения fault recovery)
• Если таск фейлится, то он будет перезапущен
на другой ноде пока доступны stages parents
• Если некоторые stages становятся недоступны,
то таски сабмитятся для расчета отсутствющих
партиций в паралели
RDD Fault Tolerance
• Восстановление может затратным по
времени для RDD c длинными цепочками
lineage и wide dependencies
• Может быть полезным сохранять состояния
некоторых RDD в надежное хранилище
• Решение, что сохранять, остается за
разработчиком
Memory Management
• Если недостаточно памяти для новых
партиций RDD, то будет использоваться
механизм вытеснения LRU (least recently used)
• Spark предоставляет три опции для хранения
persistent RDD
– В memory storage в виде deserialized Java objects
– В memory storage в виде serialized Java objects
– На diыsk storage
Memory Management
• В случае persistent RDD каждая нода хранит любые
партиции RDD в RAM
• Это позволяет новым actions выполняться намного
быстрее
• Для этого используются методы persist() или cache()
• Различные уровни хранения:
– MEMORY ONLY
– MEMORY AND DISK
– MEMORY ONLY SER
– MEMORY AND DISK SER
– MEMORY ONLY 2, MEMORY AND DISK 2 и т.д..
RDD Applications
• Приложения, которые подходят для RDD
– Batch applications, которые применяют одну
операцию ко все элемента из набора данных
• Приложения, которые не подходят для RDD
– Приложения, которые выполняют asynchronous
ne-grained updates, изменяя общее состояние
(например, storage system для веб-
приложений)
Итог
• RDD – это распределенная абстракция
памяти, которая является fault tolerant и
эффективной
• Два типа операций: Transformations и
Actions
• RDD fault tolerance: Lineage
val file = spark.textFile("hdfs://...")
val errors = file.filter(line => line.contains("ERROR"))
// Count all the errors
errors.count()
// Count errors mentioning MySQL
errors.filter(line => line.contains("MySQL")).count()
// Fetch the MySQL errors as an array of strings
errors.filter(line => line.contains("MySQL")).collect()
Примеры: Text Search (Scala)
file = spark.textFile("hdfs://...")
errors = file.filter(lambda line: "ERROR" in line)
# Count all the errors
errors.count()
# Count errors mentioning MySQL
errors.filter(lambda line: "MySQL" in line).count()
# Fetch the MySQL errors as an array of strings
errors.filter(lambda line: "MySQL" in line).collect()
Примеры: Text Search (Python)
JavaRDD<String> file = spark.textFile("hdfs://...");
JavaRDD<String> errors = file.filter(new Function<String, Boolean>() {
public Boolean call(String s) { return s.contains("ERROR"); }
});
// Count all the errors
errors.count();
// Count errors mentioning MySQL
errors.filter(new Function<String, Boolean>() {
public Boolean call(String s) { return s.contains("MySQL"); }
}).count();
// Fetch the MySQL errors as an array of strings
errors.filter(new Function<String, Boolean>() {
public Boolean call(String s) { return s.contains("MySQL"); }
}).collect();
Примеры: Text Search (Java)
val file = spark.textFile("hdfs://...")
val counts = file.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey(_ + _)
counts.saveAsTextFile("hdfs://...")
Примеры: Word Count (Scala)
file = spark.textFile("hdfs://...")
counts = file.flatMap(lambda line: line.split(" ")) 
.map(lambda word: (word, 1)) 
.reduceByKey(lambda a, b: a + b)
counts.saveAsTextFile("hdfs://...")
Примеры: Word Count (Python)
JavaRDD<String> file = spark.textFile("hdfs://...");
JavaRDD<String> words = file.flatMap(new FlatMapFunction<String, String>() {
public Iterable<String> call(String s) { return Arrays.asList(s.split(" ")); }
});
JavaPairRDD<String, Integer> pairs = words.mapToPair(new
PairFunction<String, String, Integer>() {
public Tuple2<String, Integer> call(String s) { return new Tuple2<String,
Integer>(s, 1); }
});
JavaPairRDD<String, Integer> counts = pairs.reduceByKey(new
Function2<Integer, Integer>() {
public Integer call(Integer a, Integer b) { return a + b; }
});
counts.saveAsTextFile("hdfs://...");
Примеры: Word Count (Java)
Вопросы?

More Related Content

What's hot

Hive + Tez: A Performance Deep Dive
Hive + Tez: A Performance Deep DiveHive + Tez: A Performance Deep Dive
Hive + Tez: A Performance Deep Dive
DataWorks Summit
 
오픈소스컨설팅 클러스터제안 V1.0
오픈소스컨설팅 클러스터제안 V1.0오픈소스컨설팅 클러스터제안 V1.0
오픈소스컨설팅 클러스터제안 V1.0
sprdd
 

What's hot (20)

Spark - Alexis Seigneurin (Français)
Spark - Alexis Seigneurin (Français)Spark - Alexis Seigneurin (Français)
Spark - Alexis Seigneurin (Français)
 
Tuning and Debugging in Apache Spark
Tuning and Debugging in Apache SparkTuning and Debugging in Apache Spark
Tuning and Debugging in Apache Spark
 
Redis - Usability and Use Cases
Redis - Usability and Use CasesRedis - Usability and Use Cases
Redis - Usability and Use Cases
 
07 - Hadoop. Решение задач с помощью MapReduce
07 - Hadoop. Решение задач с помощью MapReduce07 - Hadoop. Решение задач с помощью MapReduce
07 - Hadoop. Решение задач с помощью MapReduce
 
C* Summit 2013: The World's Next Top Data Model by Patrick McFadin
C* Summit 2013: The World's Next Top Data Model by Patrick McFadinC* Summit 2013: The World's Next Top Data Model by Patrick McFadin
C* Summit 2013: The World's Next Top Data Model by Patrick McFadin
 
Apache Spark Performance tuning and Best Practise
Apache Spark Performance tuning and Best PractiseApache Spark Performance tuning and Best Practise
Apache Spark Performance tuning and Best Practise
 
MapR Tutorial Series
MapR Tutorial SeriesMapR Tutorial Series
MapR Tutorial Series
 
Apache Spark on K8S Best Practice and Performance in the Cloud
Apache Spark on K8S Best Practice and Performance in the CloudApache Spark on K8S Best Practice and Performance in the Cloud
Apache Spark on K8S Best Practice and Performance in the Cloud
 
Deep Dive into Cassandra
Deep Dive into CassandraDeep Dive into Cassandra
Deep Dive into Cassandra
 
Introduction to Redis
Introduction to RedisIntroduction to Redis
Introduction to Redis
 
Apache Zookeeper
Apache ZookeeperApache Zookeeper
Apache Zookeeper
 
Zookeeper Introduce
Zookeeper IntroduceZookeeper Introduce
Zookeeper Introduce
 
Introduction to Spark Internals
Introduction to Spark InternalsIntroduction to Spark Internals
Introduction to Spark Internals
 
Deep Dive with Spark Streaming - Tathagata Das - Spark Meetup 2013-06-17
Deep Dive with Spark Streaming - Tathagata  Das - Spark Meetup 2013-06-17Deep Dive with Spark Streaming - Tathagata  Das - Spark Meetup 2013-06-17
Deep Dive with Spark Streaming - Tathagata Das - Spark Meetup 2013-06-17
 
Apache Spark in Depth: Core Concepts, Architecture & Internals
Apache Spark in Depth: Core Concepts, Architecture & InternalsApache Spark in Depth: Core Concepts, Architecture & Internals
Apache Spark in Depth: Core Concepts, Architecture & Internals
 
Hive + Tez: A Performance Deep Dive
Hive + Tez: A Performance Deep DiveHive + Tez: A Performance Deep Dive
Hive + Tez: A Performance Deep Dive
 
오픈소스컨설팅 클러스터제안 V1.0
오픈소스컨설팅 클러스터제안 V1.0오픈소스컨설팅 클러스터제안 V1.0
오픈소스컨설팅 클러스터제안 V1.0
 
Introduction to Redis
Introduction to RedisIntroduction to Redis
Introduction to Redis
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
 
[오픈소스컨설팅] Red Hat ReaR (relax and-recover) Quick Guide
[오픈소스컨설팅] Red Hat ReaR (relax and-recover) Quick Guide[오픈소스컨설팅] Red Hat ReaR (relax and-recover) Quick Guide
[오픈소스컨설팅] Red Hat ReaR (relax and-recover) Quick Guide
 

Viewers also liked

Viewers also liked (7)

Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
 

Similar to Лекция 12. Spark

Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12
Alex Tutubalin
 
Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)
Ontico
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Ontico
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012
Alex Tutubalin
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Mikhail Kurnosov
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Ontico
 

Similar to Лекция 12. Spark (20)

13 - Hadoop. Парадигма Spark
13 - Hadoop. Парадигма Spark13 - Hadoop. Парадигма Spark
13 - Hadoop. Парадигма Spark
 
Apache spark
Apache sparkApache spark
Apache spark
 
Apache Spark — Егор Пахомов
Apache Spark — Егор ПахомовApache Spark — Егор Пахомов
Apache Spark — Егор Пахомов
 
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache SparkDF1 - BD - Baranov - Mining Large Datasets with Apache Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
 
14 - Hadoop. Фреймворк Spark
14 - Hadoop. Фреймворк Spark14 - Hadoop. Фреймворк Spark
14 - Hadoop. Фреймворк Spark
 
Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12
 
Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)
 
Максим Богук. Postgres-XC
Максим Богук. Postgres-XCМаксим Богук. Postgres-XC
Максим Богук. Postgres-XC
 
Scala for android
Scala for androidScala for android
Scala for android
 
Hadoop presentation
Hadoop presentationHadoop presentation
Hadoop presentation
 
Expert Fridays Spark Job
Expert Fridays Spark JobExpert Fridays Spark Job
Expert Fridays Spark Job
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012
 
Пути увеличения эффективности реализации алгоритмов машинного обучения
Пути увеличения эффективности реализации алгоритмов машинного обученияПути увеличения эффективности реализации алгоритмов машинного обучения
Пути увеличения эффективности реализации алгоритмов машинного обучения
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
 
Cassandra db
Cassandra dbCassandra db
Cassandra db
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEB
 
Функциональные сети на основе библиотеки SynapseGrid
Функциональные сети на основе библиотеки SynapseGridФункциональные сети на основе библиотеки SynapseGrid
Функциональные сети на основе библиотеки SynapseGrid
 

More from Technopark

СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
Technopark
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
Technopark
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
Technopark
 
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
Technopark
 

More from Technopark (18)

СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
 
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
 
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
 
СУБД 2013 Лекция №1 "Введение и начало проектирования"
СУБД 2013 Лекция №1 "Введение и начало проектирования"СУБД 2013 Лекция №1 "Введение и начало проектирования"
СУБД 2013 Лекция №1 "Введение и начало проектирования"
 
Java осень 2014 занятие 8
Java осень 2014 занятие 8Java осень 2014 занятие 8
Java осень 2014 занятие 8
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1
 
Java осень 2014 занятие 2
Java осень 2014 занятие 2Java осень 2014 занятие 2
Java осень 2014 занятие 2
 

Лекция 12. Spark

  • 1. Методы распределенной обработки больших объемов данных в Hadoop Москва 2014 Лекция 12: Spark
  • 2. Мотивация • MapReduce отлично упрощает анализ big data на больших, но ненадежных, кластерах • Но с ростом популярности фреймворка пользователи хотят большего: – Итеративных задач, например, алгоритмы machine learning – Интерактивной аналитики
  • 3. Мотивация • Для решения обоих типов проблем требуются одна вещь, которой нет в MapReduce… – Эффективных примитивов для общих данных (Efficient primitives for data sharing) • В MapReduce единственный способ для обмена данными между задачами (jobs), это надежное хранилище (stable storage) • Репликация также замедляет систему, но это необходимо для обеспечения fault tolerance
  • 5. Пример Input Iter 1 HDFS Read HDFS Write Iter 1 HDFS Read HDFS Write HDFS Read Input Iter 1 HDFS Read Iter 1RAM RAM
  • 6. Пример Input Query 1 Result 1 Query 1 Result 1 Query 1 Result 1
  • 7. Пример Query 1 Result 1 Query 1 Result 1 Query 1 Result 1 Input RAM
  • 8. • Задача – Разработать дизайн абстракции распределенной памяти с поддержкой fault tolerant и эффективности • Решение – Resilient Distributed Datasets (RDD)
  • 9. RDD • Абстрактное представление распределенной RAM • Immutable коллекция объектов распределенных по всему кластеру • RDD делится на партиции, которые являются атомарными частями информации • Партиции RDD могут хранится на различных нодах кластера
  • 10. Программная модель Spark • Основана на parallelizable operators • Эти операторы являются функциями высокого порядка, которые выполняют user- defined функции параллельно • Поток обработки данных состоит из любого числа data sources, operators и data sinks путем соединения их inputs и outputs
  • 11. Программная модель Spark • Задача описывается с помощью directed acyclic graphs (DAG)
  • 12. Higher-Order Functions • Higher-order functions: RDD операторы • Существует два типа операторов – transformations и actions • Transformations: lazy-операторы, которые создают новые RDD • Actions: запускают вычисления и возвращают результат в программу или пишут данные во внешнее хранилище
  • 14. RDD Transformations - Map • Все пары обрабатываются независимо // passing each element through a function. val nums = sc.parallelize(Array(1, 2, 3)) val squares = nums.map(x => x * x) // {1, 4, 9} // selecting those elements that func returns true. val even = squares.filter(x => x % 2 == 0) // {4} // mapping each element to zero or more others. nums.flatMap(x => Range(0, x, 1)) // {0, 0, 1, 0, 1, 2}
  • 15. RDD Transformations - Reduce • Пары с одинаковыми ключами группируются • Группы обрабатываются независимо val pets = sc.parallelize(Seq(("cat", 1), ("dog", 1), ("cat", 2))) pets.reduceByKey((x, y) => x + y) // {(cat, 3), (dog, 1)} pets.groupByKey() // {(cat, (1, 2)), (dog, (1))}
  • 16. RDD Transformations - Join • Выполняется equi-join по ключу • Join-кандидаты обрабатываются независимо val visits = sc.parallelize(Seq(("index.html", "1.2.3.4"), ("about.html", "3.4.5.6"), ("index.html", "1.3.3.1"))) val pageNames = sc.parallelize(Seq(("index.html", "Home"), ("about.html", "About"))) visits.join(pageNames) // ("index.html", ("1.2.3.4", "Home")) // ("index.html", ("1.3.3.1", "Home")) // ("about.html", ("3.4.5.6", "About"))
  • 17. RDD Transformations - CoGroup • Каждый input группируется по ключу • Группы с одинаковыми ключами обрабатываются вместе val visits = sc.parallelize(Seq(("index.html", "1.2.3.4"), ("about.html", "3.4.5.6"), ("index.html", "1.3.3.1"))) val pageNames = sc.parallelize(Seq(("index.html", "Home"), ("about.html", "About"))) visits.cogroup(pageNames) // ("index.html", (("1.2.3.4", "1.3.3.1"), ("Home"))) // ("about.html", (("3.4.5.6"), ("About")))
  • 18. RDD Transformations - Union и Sample • Union: объединяет два RDD и возвращает один RDD используя bag-семантику, т.е. дубликаты не удаляются • Sample: похоже на map, за исключением того, что RDD сохраняет seed для генератора произвольных чисел для каждой партии чтобы детермировано выбирать сэмпл записей
  • 19. RDD Actions • Возвращает все элементы RDD в виде массива val nums = sc.parallelize(Array(1, 2, 3)) nums.collect() // Array(1, 2, 3) • Возвращает массив с первыми n элементами RDD nums.take(2) // Array(1, 2) • Возвращает число элементов в RDD nums.count() // 3
  • 20. RDD Actions • Агрегирует элементы RDD используя заданную функцию nums.reduce((x, y) => x + y) // или nums.reduce(_ + _) // 6 • Записывает элементы RDD в виде текстового файла nums.saveAsTextFile("hdfs://file.txt")
  • 21. SparkContext • Основная точка входа для работы со Spark • Доступна в shell как переменная sc • В standalone-программах необходимо создавать отдельно import org.apache.spark.SparkContext import org.apache.spark.SparkContext._ val sc = new SparkContext(master, appName, [sparkHome], [jars]) local local[k] spark://host:port mesos://host:port
  • 22. Создание RDD • Преобразовать коллекцию в RDD val a = sc.parallelize(Array(1, 2, 3)) • Загрузить текст из локальной FS, HDFS или S3 val a = sc.textFile("file.txt") val b = sc.textFile("directory/*.txt") val c = sc.textFile("hdfs://namenode:9000/path/file")
  • 23. Пример • Посчитать число строк содержащих MAIL val file = sc.textFile("hdfs://...") val sics = file.filter(_.contains("MAIL")) // transformation val cached = sics.cache() val ones = cached.map(_ => 1) // transformation val count = ones.reduce(_+_) // action val file = sc.textFile("hdfs://...") val count = file.filter(_.contains(“MAIL")).count() transformation action
  • 24. Shared Variables • Когда Spark запускает выполнение функции параллельно как набор тасков на различных нодах, то отправляется копия каждой переменной, используемой в функции, на каждый таск • Иногда нужно, чтобы переменная была общая между тасками или между тасками программой-драйвером
  • 25. Shared Variables • Обновления переменных не распространяются обратно в программу-драйвер • Использование обычных read-write общих переменные между тасками неэффективно – К примеру, необходимо отправить на каждую ноду большой датасет • Есть два типа shared variables – broadcast variables – accumulators
  • 26. Shared Variables: Broadcast Variables • Read-only переменные кешируются на каждой машине вместо того, чтобы отправлять копию на каждый таск • Broadcast Variables не отсылаются на ноду больше одного раза scala> val broadcastVar = sc.broadcast(Array(1, 2, 3)) broadcastVar: spark.Broadcast[Array[Int]] = spark.Broadcast(b5c40191-...) scala> broadcastVar.value res0: Array[Int] = Array(1, 2, 3)
  • 27. Shared Variables: Accumulators • Могут быть только добавлены • Могут использоваться для реализации счетчиков и сумматоров • Таски, работающие на кластере, могут затем добавлять значение используя оператор += scala> val accum = sc.accumulator(0) accum: spark.Accumulator[Int] = 0 scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x) ... scala> accum.value res2: Int = 10
  • 28. Apache Spark Engine • Lightning-fast cluster computing! • Apache Spark – быстрый и многоцелевой «движок» для обработки больших объемов данных • Предоставляет программный интерфейс на Scala • Каждый RDD является объектов в Spark
  • 29. Apache Spark • Скорость – Работает быстрее чем Hadoop MapReduce в 100 раз, если данные в памяти, и в 10 раз, если данные на диске • В Spark есть продвинутый DAG-механизм выполнения задач, которые поддерживает cyclic data flow и in-memory computing • Легкость использования – Просто писать приложения на Java, Scala и Python • Более 80 высокоуровневых операторов для построения параллельных приложений • Их можно использовать интерактивно в shell на Scala и Python
  • 30. Apache Spark • Обобщенность – Комбинирование SQL, streaming и комплексной аналитики в рамках одного приложения • Spark SQL, Mlib, GraphX и Spark Streaming • Работает везде – Hadoop, Mesos, standalone или в облаке – Доступ к данных из различных источников, включая HDFS, Cassandra, HBase, S3 • https://spark.apache.org/
  • 31. Программный интерфейс Spark • Приложение на Spark состоит из программы- драйвера, которая запускает пользовательскую функцию main и выполняет различные операции параллельно на кластере
  • 32. Lineage • Lineage: это transformations, используемые для построения RDD • RDD сохраняются как цепочка объектов, охватывающих весь lineage каждого RDD val file = sc.textFile("hdfs://...") val mail = file.filter(_.contains("MAIL")) val cached = mail.cache() val ones = cached.map(_ => 1) val count = ones.reduce(_+_)
  • 33. Dependencies RDD • Два типа зависимостей между RDD – Narrow – Wide
  • 34. Dependencies RDD: Narrow • Narrow: каждая партиция родительского RDD используется как минимум в одной дочерней партиции RDD • Narrow dependencies позволяют выполнять pipelined execution на одной ноде кластера: – Напр., фильтр следуемый за Map
  • 35. Dependencies RDD: Wide • Wide: каждая партиция родительского RDD используется в множестве дочерних партиций RDD
  • 36. Job Scheduling • Когда пользователь запускает action на RDD шедулер строит DAG из stages графа RDD lineage • Stage содержит различные pipelined transformations c narrow dependencies • Граница для stage – Shuffles для wide dependencies – Уже обработанные партиции
  • 37. Job Scheduling • Шедулер запускает таски для обработки оставшихся партиций (missing partitions) из каждой stage пока не обработается целевая (target) RDD • Таски назначаются машинам на основе локальности – Если таску требуется партиция, которая доступна в памяти на ноде, то таск отправляется на эту ноду
  • 38. RDD Fault Tolerance • RDD поддерживает информацию о lineage, которая может быть использована для восстановления потерянных партиций • Логгирование lineage • Отсутсвие репликации • Пересчет только потерянных партиций (lost partitions) RDD
  • 39. RDD Fault Tolerance • Промежуточные результаты из wide dependencies материлизуются на нодах, отвечающих за родительские партиции (для упрощения fault recovery) • Если таск фейлится, то он будет перезапущен на другой ноде пока доступны stages parents • Если некоторые stages становятся недоступны, то таски сабмитятся для расчета отсутствющих партиций в паралели
  • 40. RDD Fault Tolerance • Восстановление может затратным по времени для RDD c длинными цепочками lineage и wide dependencies • Может быть полезным сохранять состояния некоторых RDD в надежное хранилище • Решение, что сохранять, остается за разработчиком
  • 41. Memory Management • Если недостаточно памяти для новых партиций RDD, то будет использоваться механизм вытеснения LRU (least recently used) • Spark предоставляет три опции для хранения persistent RDD – В memory storage в виде deserialized Java objects – В memory storage в виде serialized Java objects – На diыsk storage
  • 42. Memory Management • В случае persistent RDD каждая нода хранит любые партиции RDD в RAM • Это позволяет новым actions выполняться намного быстрее • Для этого используются методы persist() или cache() • Различные уровни хранения: – MEMORY ONLY – MEMORY AND DISK – MEMORY ONLY SER – MEMORY AND DISK SER – MEMORY ONLY 2, MEMORY AND DISK 2 и т.д..
  • 43. RDD Applications • Приложения, которые подходят для RDD – Batch applications, которые применяют одну операцию ко все элемента из набора данных • Приложения, которые не подходят для RDD – Приложения, которые выполняют asynchronous ne-grained updates, изменяя общее состояние (например, storage system для веб- приложений)
  • 44. Итог • RDD – это распределенная абстракция памяти, которая является fault tolerant и эффективной • Два типа операций: Transformations и Actions • RDD fault tolerance: Lineage
  • 45. val file = spark.textFile("hdfs://...") val errors = file.filter(line => line.contains("ERROR")) // Count all the errors errors.count() // Count errors mentioning MySQL errors.filter(line => line.contains("MySQL")).count() // Fetch the MySQL errors as an array of strings errors.filter(line => line.contains("MySQL")).collect() Примеры: Text Search (Scala)
  • 46. file = spark.textFile("hdfs://...") errors = file.filter(lambda line: "ERROR" in line) # Count all the errors errors.count() # Count errors mentioning MySQL errors.filter(lambda line: "MySQL" in line).count() # Fetch the MySQL errors as an array of strings errors.filter(lambda line: "MySQL" in line).collect() Примеры: Text Search (Python)
  • 47. JavaRDD<String> file = spark.textFile("hdfs://..."); JavaRDD<String> errors = file.filter(new Function<String, Boolean>() { public Boolean call(String s) { return s.contains("ERROR"); } }); // Count all the errors errors.count(); // Count errors mentioning MySQL errors.filter(new Function<String, Boolean>() { public Boolean call(String s) { return s.contains("MySQL"); } }).count(); // Fetch the MySQL errors as an array of strings errors.filter(new Function<String, Boolean>() { public Boolean call(String s) { return s.contains("MySQL"); } }).collect(); Примеры: Text Search (Java)
  • 48. val file = spark.textFile("hdfs://...") val counts = file.flatMap(line => line.split(" ")) .map(word => (word, 1)) .reduceByKey(_ + _) counts.saveAsTextFile("hdfs://...") Примеры: Word Count (Scala)
  • 49. file = spark.textFile("hdfs://...") counts = file.flatMap(lambda line: line.split(" ")) .map(lambda word: (word, 1)) .reduceByKey(lambda a, b: a + b) counts.saveAsTextFile("hdfs://...") Примеры: Word Count (Python)
  • 50. JavaRDD<String> file = spark.textFile("hdfs://..."); JavaRDD<String> words = file.flatMap(new FlatMapFunction<String, String>() { public Iterable<String> call(String s) { return Arrays.asList(s.split(" ")); } }); JavaPairRDD<String, Integer> pairs = words.mapToPair(new PairFunction<String, String, Integer>() { public Tuple2<String, Integer> call(String s) { return new Tuple2<String, Integer>(s, 1); } }); JavaPairRDD<String, Integer> counts = pairs.reduceByKey(new Function2<Integer, Integer>() { public Integer call(Integer a, Integer b) { return a + b; } }); counts.saveAsTextFile("hdfs://..."); Примеры: Word Count (Java)