SlideShare ist ein Scribd-Unternehmen logo
1 von 51
Downloaden Sie, um offline zu lesen
Методы распределенной обработки
больших объемов данных в 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)
Вопросы?

Weitere ähnliche Inhalte

Was ist angesagt?

Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveTechnopark
 
Introduction to spark
Introduction to sparkIntroduction to spark
Introduction to sparkDuyhai Doan
 
Introduction to Big Data and hadoop
Introduction to Big Data and hadoopIntroduction to Big Data and hadoop
Introduction to Big Data and hadoopSandeep Patil
 
Hadoop YARN | Hadoop YARN Architecture | Hadoop YARN Tutorial | Hadoop Tutori...
Hadoop YARN | Hadoop YARN Architecture | Hadoop YARN Tutorial | Hadoop Tutori...Hadoop YARN | Hadoop YARN Architecture | Hadoop YARN Tutorial | Hadoop Tutori...
Hadoop YARN | Hadoop YARN Architecture | Hadoop YARN Tutorial | Hadoop Tutori...Simplilearn
 
Introduction to YARN and MapReduce 2
Introduction to YARN and MapReduce 2Introduction to YARN and MapReduce 2
Introduction to YARN and MapReduce 2Cloudera, Inc.
 
Seminar Presentation Hadoop
Seminar Presentation HadoopSeminar Presentation Hadoop
Seminar Presentation HadoopVarun Narang
 
Apache Druid 101
Apache Druid 101Apache Druid 101
Apache Druid 101Data Con LA
 
Hadoop Overview & Architecture
Hadoop Overview & Architecture  Hadoop Overview & Architecture
Hadoop Overview & Architecture EMC
 
Introduction to hadoop and hdfs
Introduction to hadoop and hdfsIntroduction to hadoop and hdfs
Introduction to hadoop and hdfsshrey mehrotra
 
Why your Spark Job is Failing
Why your Spark Job is FailingWhy your Spark Job is Failing
Why your Spark Job is FailingDataWorks Summit
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceTechnopark
 
Introduction to Spark Internals
Introduction to Spark InternalsIntroduction to Spark Internals
Introduction to Spark InternalsPietro Michiardi
 
Hadoop File system (HDFS)
Hadoop File system (HDFS)Hadoop File system (HDFS)
Hadoop File system (HDFS)Prashant Gupta
 

Was ist angesagt? (20)

Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
 
Hadoop Technology
Hadoop TechnologyHadoop Technology
Hadoop Technology
 
Introduction to spark
Introduction to sparkIntroduction to spark
Introduction to spark
 
Hadoop fault-tolerance
Hadoop fault-toleranceHadoop fault-tolerance
Hadoop fault-tolerance
 
Introduction to Big Data and hadoop
Introduction to Big Data and hadoopIntroduction to Big Data and hadoop
Introduction to Big Data and hadoop
 
Hadoop YARN | Hadoop YARN Architecture | Hadoop YARN Tutorial | Hadoop Tutori...
Hadoop YARN | Hadoop YARN Architecture | Hadoop YARN Tutorial | Hadoop Tutori...Hadoop YARN | Hadoop YARN Architecture | Hadoop YARN Tutorial | Hadoop Tutori...
Hadoop YARN | Hadoop YARN Architecture | Hadoop YARN Tutorial | Hadoop Tutori...
 
Introduction to YARN and MapReduce 2
Introduction to YARN and MapReduce 2Introduction to YARN and MapReduce 2
Introduction to YARN and MapReduce 2
 
Yarn
YarnYarn
Yarn
 
Hadoop YARN
Hadoop YARNHadoop YARN
Hadoop YARN
 
Seminar Presentation Hadoop
Seminar Presentation HadoopSeminar Presentation Hadoop
Seminar Presentation Hadoop
 
Apache Druid 101
Apache Druid 101Apache Druid 101
Apache Druid 101
 
Map reduce vs spark
Map reduce vs sparkMap reduce vs spark
Map reduce vs spark
 
Hadoop Overview & Architecture
Hadoop Overview & Architecture  Hadoop Overview & Architecture
Hadoop Overview & Architecture
 
Introduction to hadoop and hdfs
Introduction to hadoop and hdfsIntroduction to hadoop and hdfs
Introduction to hadoop and hdfs
 
Why your Spark Job is Failing
Why your Spark Job is FailingWhy your Spark Job is Failing
Why your Spark Job is Failing
 
Hadoop Map Reduce
Hadoop Map ReduceHadoop Map Reduce
Hadoop Map Reduce
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
 
Introduction to Spark Internals
Introduction to Spark InternalsIntroduction to Spark Internals
Introduction to Spark Internals
 
Hadoop File system (HDFS)
Hadoop File system (HDFS)Hadoop File system (HDFS)
Hadoop File system (HDFS)
 
1. Apache HIVE
1. Apache HIVE1. Apache HIVE
1. Apache HIVE
 

Andere mochten auch

Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Technopark
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuTechnopark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache MahoutTechnopark
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSTechnopark
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeperTechnopark
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Technopark
 
Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelTechnopark
 

Andere mochten auch (7)

Лекция 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 (введение)
 
Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
 

Ähnlich wie Лекция 12. Spark

13 - Hadoop. Парадигма Spark
13 - Hadoop. Парадигма Spark13 - Hadoop. Парадигма Spark
13 - Hadoop. Парадигма SparkRoman Brovko
 
Apache Spark — Егор Пахомов
Apache Spark — Егор ПахомовApache Spark — Егор Пахомов
Apache Spark — Егор ПахомовYandex
 
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 SparkMoscowDataFest
 
14 - Hadoop. Фреймворк Spark
14 - Hadoop. Фреймворк Spark14 - Hadoop. Фреймворк Spark
14 - Hadoop. Фреймворк SparkRoman Brovko
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Alex Tutubalin
 
Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)Ontico
 
Максим Богук. Postgres-XC
Максим Богук. Postgres-XCМаксим Богук. Postgres-XC
Максим Богук. Postgres-XCPostgreSQL-Consulting
 
Hadoop presentation
Hadoop presentationHadoop presentation
Hadoop presentationVlad Orlov
 
Expert Fridays Spark Job
Expert Fridays Spark JobExpert Fridays Spark Job
Expert Fridays Spark JobProvectus
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Ontico
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012Alex Tutubalin
 
Пути увеличения эффективности реализации алгоритмов машинного обучения
Пути увеличения эффективности реализации алгоритмов машинного обученияПути увеличения эффективности реализации алгоритмов машинного обучения
Пути увеличения эффективности реализации алгоритмов машинного обученияAndrew Babiy
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelMikhail 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
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEBAlexandre Kalendarev
 
Функциональные сети на основе библиотеки SynapseGrid
Функциональные сети на основе библиотеки SynapseGridФункциональные сети на основе библиотеки SynapseGrid
Функциональные сети на основе библиотеки SynapseGridАрсений Жижелев
 

Ähnlich wie Лекция 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
 

Mehr von Technopark

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

Mehr von 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)