SlideShare a Scribd company logo
1 of 21
Download to read offline
Apache
Михаил Михайленко, Moneytap/I-Free, 2015
http://spark.apache.org/
http://i-free.com/
http://moneytapp.com/
https://vk.com/sniff303
Что это такое?
Framework для написания распределенных приложений
обрабатывающих данные. Решает задачи:
• Map-Reduce, но в памяти (это не означает, что объем данных должен быть меньше чем
объем RAM)
• Stream Processing
Для чего это нужно?
• Любые аналитические отчеты, к примеру, как Яндекс.Метрика или
Google Analytics
• Задачи машинного обучения (классификация, прогнозы...)
• …
Альтернативы и отличии
Spark как альтернатива Hadoop для Map-Reduce
• Доступное API на Scala, Python и Java
• Не требует очень тяжелой настройки для небольших инсталляций
• Выигрывает в скорости, осуществляя процессинг данных, храня их в памяти и вылезая на
диск только при необходимости
Spark Streaming как альтернатива Apache Storm
• Гарантированная обработка каждого события только один раз
Как все устроено?
Driver Program — часть вашего приложения отвечающего за связь c кластером.
Cluster Manager — процесс или группа процессов, осуществляющих распределение ресурсов
всего кластера.
Worker Node — группа процессов на различных машинах, осуществляют контроль за ресурсами
машины, на которой находятся.
Executor — процессы, непосредственно исполняющие задачи.
Режимы работы
• Local
• Standalone (+ ZooKeeper)
• Hadoop YARN
• Apache MESOS
Как с этим работать?
Map-Reduce
Источник изображения: http://xiaochongzhang.me/blog/?p=338
Resilient Distributed Dataset
RDD - Распределенная, неизменяемая коллекция элементов,
доступная для параллельной обработки. Она знает как вычислить саму
себя в случае сбоя, а так же хранит ссылки на своих предков. Может
быть записана на диск.
RDD RDD RDD
transform transform
Загрузка данных в RDD
Источники:
• Local file system
• HDFS
• Cassandra
• HBase
• Amazon S3
Форматы:
• Plain text
• GZIPpped plain text
• Hadoop InputFormat’s
JavaRDD<String> localRDD = sparkContext.textFile("/path/data_2015_05_*.txt.gz");
JavaRDD<String> hdfsRDD = sparkContext.textFile("hdfs://...");
Операции над RDD
Transformations — преобразуют
данные из RDD, "лениво" создавая
новый RDD.
- .map(function)
- .flatMap(function)
- .filter(function)
- .sample(n)
- .union(anotherRDD)
- .intersection(anotherRDD)
- .distinct()
- .groupByKey()
- .reduceByKey()
- .join(anotherRDD)
Actions - возвращают результаты в
ваше приложение.
- .reduce(function)
- .collect()
- .count()
- .take(n)
- .takeOrdered(n, comparator)
- .foreach(function)
Persistence — сохранение RDD.
- .saveAs...()
- .persist(memoryLevel)
- .unpersist()
Map<String, Long> sdkVersions = sparkContext.textFile(filePath)
.filter(s -> s.contains("AD_GET"))
.map(s -> Extractors.extractSdkVersion(s))
.mapToPair(t -> new Tuple2<>(t._2(), 1L))
.reduceByKey((left, right) -> left + right)
.collectAsMap();
Общие переменные
Broadcast variables —
Read-only переменные, значение
которых доступно с любого Executor'а
вашей программы. Разъезжаются по
кластеру с помощью P2P протокола.
Accumulators —
Переменные, изменять значения
которых можно только путем
прибавления к ним какого либо
значения.
List<Long> largeList = ...;
Broadcast<List<Long>> broadcastVar = sparkContext.broadcast(largeList);
Accumulator<Long> accum = sparkContext.accumulator(0);
public class MapAccumulator implements AccumulatorParam<Map<Long, Long>> {
@Override
public Map<Long, Long> addAccumulator(Map<Long, Long> m1, Map<Long, Long> m2) {
for (Map.Entry<Long, Long> m2entry : m2.entrySet()) {
Long m1val = m1.get(m2entry.getKey());
if (m1val == null) {
m1val = m2entry.getValue();
} else {
m1val += m2entry.getValue();
}
m1.put(m2entry.getKey(), m1val);
}
return m1;
}
//…
}
Пример!
public class SparkExample {
public static void main(String... args) {
if (args.length < 3) {
throw new IllegalArgumentException();
}
String date = args[0];
String appId = args[1];
String network = args[2];
final String filePath = String.format("/var/stat/%s/mt/%s/%s/*.ldjson.gz", date, appId, network);
SparkConf sparkConfiguration =
new SparkConf().setAppName("SparkExample-" + date + "-" + appId + "-" + network);
JavaSparkContext sparkContext = new JavaSparkContext(sparkConfiguration);
JavaRDD<Tuple3<String, String, Long>> dataForApp =
sparkContext.textFile(filePath)
.filter(StringFilter.containJsonKeyValue("statisticEventType", "AD_GET"))
.map(line -> {
JsonExtractor extract = JsonExtractor.from(line);
return new Tuple3<>(
extract.visitorId(), extract.device(), extract.timestamp()
);
})
.setName("SparkExampleRDD")
.persist(StorageLevel.MEMORY_ONLY_SER());
Map<String, Long> topDevices = dataForApp.mapToPair(t -> new Tuple2<>(t._2(), 1L))
.reduceByKey((left, right) -> left + right)
.top(50, DeviceTupleComparator.instance())
.stream()
.collect(Collectors.toMap(Tuple2::_1, Tuple2::_2));
JavaRDD<Tuple2<Long, Long>> usersToSessions =
dataForApp.mapToPair(t -> new Tuple2<>(t._1(), t._3()))
.groupByKey()
.flatMap(t -> {
Iterator<Long> timestamps = t._2().iterator();
SessionCalculator sessions = SessionCalculator.from(timestamps);
if (sessions.isAny()) {
return Collections.singletonList(
new Tuple2<>(sessions.getCount(),
sessions.getApproximateLength()));
} else {
return Collections.emptyList();
}
});
Accumulator<Double> activeUsersAccumulator = sparkContext.accumulator(0.0D);
Accumulator<Map<Long, Long>> sessionLengthAccumulator =
sparkContext.accumulator(new HashMap<>(), MapAccumulator.get());
Accumulator<Map<Long, Long>> sessionCountAccumulator =
sparkContext.accumulator(new HashMap<>(), MapAccumulator.get());
usersToSessions.foreach(t -> {
activeUsersAccumulator.add(1.0D); // active users
Long count = t._1(); // session count for user
Map<Long, Long> map2 = new HashMap<>();
map2.put(count, 1L);
sessionCountAccumulator.add(map2);
Long minute = t._2(); // session length for user
Map<Long, Long> map = new HashMap<>();
map.put(minute, 1L);
sessionLengthAccumulator.add(map);
});
Map<Long, Long> sessionLengthDistribution = sessionLengthAccumulator.value();
Map<Long, Long> sessionCountDistribution = sessionCountAccumulator.value();
Long activeUsers = activeUsersAccumulator.value().longValue();
System.out.printf("topDevices: %s", topDevices);
System.out.printf("sessionLengthDistribution: %s", sessionLengthDistribution);
System.out.printf("sessionCountDistribution: %s", sessionCountDistribution);
System.out.printf("activeUsers: %s", activeUsers);
dataForApp.unpersist(true);
sparkContext.stop();
}
}
Запуск кластера Spark в простейшем режиме
1. Скачать и распаковать архив
2. Отредактировать conf/spark-env.sh



3. Отредактировать conf/spark-defaults.conf



4. Запустить master и worker процессы
SPARK_MASTER_IP=...
SPARK_WORKER_MEMORY=...
spark.master=spark://...
spark.executor.memory=...
$ ./sbin/start-master.sh
$ ./bin/spark-class org.apache.spark.deploy.worker.Worker
Запуск вашего приложения
1. Запаковать ваш класс в «fat-jar» со всеми
зависимостями, кроме библиотек Spark’а.
2. Выполнить
$ ./bin/spark-submit --class com.ifree.SparkExample 
                     spark-example.jar 
                     2015-05-26 
                     c87ad063-c38f-4d2d-bbfe-d7ddfec5aab0 
                     moneytapp
Личный опыт
Советы при эксплуатации
• Иногда ноды падают, используйте Monit для мониторинга и
восстановления.
• Не используйте Java сериализацию. Никогда. Используйте, к примеру,
Kryo.

• Бейте исходные данные на логические куски. Меньше входной кусок,
меньше чтения с диска, меньше время обработки.
• Не используйте Enum’ы в ваших Spark приложениях.
• Экономьте память, не плодите лишние объекты, старайтесь по
возможности переиспользовать их.
• SparkSQL, на самом деле, не так удобен, как кажется на первый
взгляд.
• Нормальный менеджер задач отсутствует*, приготовьтесь иметь дело
с CRON’ом или собственными костылями. Другого способа запустить
задачу, кроме как через spark-submit — нет.
spark.serializer=org.apache.spark.serializer.KryoSerializer
Спасибо за внимание!
http://spark.apache.org/
http://lambda-architecture.net/
https://www.edx.org/course/introduction-big-data-apache-spark-uc-berkeleyx-cs100-1x

More Related Content

What's hot

Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхVasil Remeniuk
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARNTechnopark
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Ontico
 
Apache Spark — Егор Пахомов
Apache Spark — Егор ПахомовApache Spark — Егор Пахомов
Apache Spark — Егор ПахомовYandex
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Ivan Muratov
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Magneta AI
 
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduceRoman Brovko
 
15 - Hadoop. YARN. MapReduce 2.0
15 - Hadoop. YARN. MapReduce 2.015 - Hadoop. YARN. MapReduce 2.0
15 - Hadoop. YARN. MapReduce 2.0Roman Brovko
 
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru GroupDennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru GroupMail.ru Group
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooДмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooMail.ru Group
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Ontico
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)Ontico
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы HadoopTechnopark
 
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...Ontico
 
PostgreSQL Streaming Replication
PostgreSQL Streaming ReplicationPostgreSQL Streaming Replication
PostgreSQL Streaming ReplicationAlexey Lesovsky
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Ontico
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandraodnoklassniki.ru
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
 
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)Ontico
 

What's hot (20)

09 - Hadoop. Pig
09 - Hadoop. Pig09 - Hadoop. Pig
09 - Hadoop. Pig
 
Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событиях
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
 
Apache Spark — Егор Пахомов
Apache Spark — Егор ПахомовApache Spark — Егор Пахомов
Apache Spark — Егор Пахомов
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
 
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
 
15 - Hadoop. YARN. MapReduce 2.0
15 - Hadoop. YARN. MapReduce 2.015 - Hadoop. YARN. MapReduce 2.0
15 - Hadoop. YARN. MapReduce 2.0
 
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru GroupDennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooДмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в Badoo
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
 
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
 
PostgreSQL Streaming Replication
PostgreSQL Streaming ReplicationPostgreSQL Streaming Replication
PostgreSQL Streaming Replication
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandra
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
 
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
 

Viewers also liked

Mooc'и для биологов — Обзор полезных онлайн-курсов / Future Biotech 27.01.2014
Mooc'и для биологов — Обзор полезных онлайн-курсов / Future Biotech 27.01.2014Mooc'и для биологов — Обзор полезных онлайн-курсов / Future Biotech 27.01.2014
Mooc'и для биологов — Обзор полезных онлайн-курсов / Future Biotech 27.01.2014Grigory Sapunov
 
Introductory Keynote at Hadoop Workshop by Ospcon (2014)
Introductory Keynote at Hadoop Workshop by Ospcon (2014)Introductory Keynote at Hadoop Workshop by Ospcon (2014)
Introductory Keynote at Hadoop Workshop by Ospcon (2014)Andrei Nikolaenko
 
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )Shamim bhuiyan
 
Building a Location Based Social Graph in Spark at InMobi-(Seinjuti Chatterje...
Building a Location Based Social Graph in Spark at InMobi-(Seinjuti Chatterje...Building a Location Based Social Graph in Spark at InMobi-(Seinjuti Chatterje...
Building a Location Based Social Graph in Spark at InMobi-(Seinjuti Chatterje...Spark Summit
 
Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++
Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++
Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++Антон Шестаков
 
Interactive Graph Analytics with Spark-(Daniel Darabos, Lynx Analytics)
Interactive Graph Analytics with Spark-(Daniel Darabos, Lynx Analytics)Interactive Graph Analytics with Spark-(Daniel Darabos, Lynx Analytics)
Interactive Graph Analytics with Spark-(Daniel Darabos, Lynx Analytics)Spark Summit
 
Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15Alexey Zinoviev
 
Community detection (Поиск сообществ в графах)
Community detection (Поиск сообществ в графах)Community detection (Поиск сообществ в графах)
Community detection (Поиск сообществ в графах)Kirill Rybachuk
 
GraphFrames: Graph Queries In Spark SQL
GraphFrames: Graph Queries In Spark SQLGraphFrames: Graph Queries In Spark SQL
GraphFrames: Graph Queries In Spark SQLSpark Summit
 
Using spark for timeseries graph analytics
Using spark for timeseries graph analyticsUsing spark for timeseries graph analytics
Using spark for timeseries graph analyticsSigmoid
 
Building a Graph of all US Businesses Using Spark Technologies by Alexis Roos
Building a Graph of all US Businesses Using Spark Technologies by Alexis RoosBuilding a Graph of all US Businesses Using Spark Technologies by Alexis Roos
Building a Graph of all US Businesses Using Spark Technologies by Alexis RoosSpark Summit
 
Graphs are everywhere! Distributed graph computing with Spark GraphX
Graphs are everywhere! Distributed graph computing with Spark GraphXGraphs are everywhere! Distributed graph computing with Spark GraphX
Graphs are everywhere! Distributed graph computing with Spark GraphXAndrea Iacono
 
Big Graph Analytics on Neo4j with Apache Spark
Big Graph Analytics on Neo4j with Apache SparkBig Graph Analytics on Neo4j with Apache Spark
Big Graph Analytics on Neo4j with Apache SparkKenny Bastani
 
GraphFrames: Graph Queries in Spark SQL by Ankur Dave
GraphFrames: Graph Queries in Spark SQL by Ankur DaveGraphFrames: Graph Queries in Spark SQL by Ankur Dave
GraphFrames: Graph Queries in Spark SQL by Ankur DaveSpark Summit
 
Credit Fraud Prevention with Spark and Graph Analysis
Credit Fraud Prevention with Spark and Graph AnalysisCredit Fraud Prevention with Spark and Graph Analysis
Credit Fraud Prevention with Spark and Graph AnalysisJen Aman
 
Graph Analytics in Spark
Graph Analytics in SparkGraph Analytics in Spark
Graph Analytics in SparkPaco Nathan
 
Multiplatform Spark solution for Graph datasources by Javier Dominguez
Multiplatform Spark solution for Graph datasources by Javier DominguezMultiplatform Spark solution for Graph datasources by Javier Dominguez
Multiplatform Spark solution for Graph datasources by Javier DominguezBig Data Spain
 

Viewers also liked (18)

Mooc'и для биологов — Обзор полезных онлайн-курсов / Future Biotech 27.01.2014
Mooc'и для биологов — Обзор полезных онлайн-курсов / Future Biotech 27.01.2014Mooc'и для биологов — Обзор полезных онлайн-курсов / Future Biotech 27.01.2014
Mooc'и для биологов — Обзор полезных онлайн-курсов / Future Biotech 27.01.2014
 
Introductory Keynote at Hadoop Workshop by Ospcon (2014)
Introductory Keynote at Hadoop Workshop by Ospcon (2014)Introductory Keynote at Hadoop Workshop by Ospcon (2014)
Introductory Keynote at Hadoop Workshop by Ospcon (2014)
 
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )
 
Building a Location Based Social Graph in Spark at InMobi-(Seinjuti Chatterje...
Building a Location Based Social Graph in Spark at InMobi-(Seinjuti Chatterje...Building a Location Based Social Graph in Spark at InMobi-(Seinjuti Chatterje...
Building a Location Based Social Graph in Spark at InMobi-(Seinjuti Chatterje...
 
Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++
Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++
Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++
 
Interactive Graph Analytics with Spark-(Daniel Darabos, Lynx Analytics)
Interactive Graph Analytics with Spark-(Daniel Darabos, Lynx Analytics)Interactive Graph Analytics with Spark-(Daniel Darabos, Lynx Analytics)
Interactive Graph Analytics with Spark-(Daniel Darabos, Lynx Analytics)
 
Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15
 
Community detection (Поиск сообществ в графах)
Community detection (Поиск сообществ в графах)Community detection (Поиск сообществ в графах)
Community detection (Поиск сообществ в графах)
 
GraphFrames: Graph Queries In Spark SQL
GraphFrames: Graph Queries In Spark SQLGraphFrames: Graph Queries In Spark SQL
GraphFrames: Graph Queries In Spark SQL
 
Using spark for timeseries graph analytics
Using spark for timeseries graph analyticsUsing spark for timeseries graph analytics
Using spark for timeseries graph analytics
 
Building a Graph of all US Businesses Using Spark Technologies by Alexis Roos
Building a Graph of all US Businesses Using Spark Technologies by Alexis RoosBuilding a Graph of all US Businesses Using Spark Technologies by Alexis Roos
Building a Graph of all US Businesses Using Spark Technologies by Alexis Roos
 
Graphs are everywhere! Distributed graph computing with Spark GraphX
Graphs are everywhere! Distributed graph computing with Spark GraphXGraphs are everywhere! Distributed graph computing with Spark GraphX
Graphs are everywhere! Distributed graph computing with Spark GraphX
 
Big Graph Analytics on Neo4j with Apache Spark
Big Graph Analytics on Neo4j with Apache SparkBig Graph Analytics on Neo4j with Apache Spark
Big Graph Analytics on Neo4j with Apache Spark
 
GraphFrames: Graph Queries in Spark SQL by Ankur Dave
GraphFrames: Graph Queries in Spark SQL by Ankur DaveGraphFrames: Graph Queries in Spark SQL by Ankur Dave
GraphFrames: Graph Queries in Spark SQL by Ankur Dave
 
Credit Fraud Prevention with Spark and Graph Analysis
Credit Fraud Prevention with Spark and Graph AnalysisCredit Fraud Prevention with Spark and Graph Analysis
Credit Fraud Prevention with Spark and Graph Analysis
 
Flume vs. kafka
Flume vs. kafkaFlume vs. kafka
Flume vs. kafka
 
Graph Analytics in Spark
Graph Analytics in SparkGraph Analytics in Spark
Graph Analytics in Spark
 
Multiplatform Spark solution for Graph datasources by Javier Dominguez
Multiplatform Spark solution for Graph datasources by Javier DominguezMultiplatform Spark solution for Graph datasources by Javier Dominguez
Multiplatform Spark solution for Graph datasources by Javier Dominguez
 

Similar to Apache spark

Hacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаHacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаAnastasia Lubennikova
 
О.В.Сухорослов "MapReduce"
О.В.Сухорослов "MapReduce"О.В.Сухорослов "MapReduce"
О.В.Сухорослов "MapReduce"Yandex
 
Expert Fridays Spark Job
Expert Fridays Spark JobExpert Fridays Spark Job
Expert Fridays Spark JobProvectus
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
 
Observable как атом приложения
Observable как атом приложенияObservable как атом приложения
Observable как атом приложенияArtem Bey
 
Программирование на PySpark
Программирование на PySparkПрограммирование на PySpark
Программирование на PySparkRamblerML
 
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...Ontico
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupMail.ru Group
 
Работа с Big Data
Работа с Big Data Работа с Big Data
Работа с Big Data MATLAB
 
Дополненная Реальность в Облаке
Дополненная Реальность в ОблакеДополненная Реальность в Облаке
Дополненная Реальность в ОблакеGeeksLab Odessa
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf Conference
 
SAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationSAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationNikolay Samokhvalov
 
Hadoop implementation in Wikimart
Hadoop implementation in WikimartHadoop implementation in Wikimart
Hadoop implementation in WikimartRoman Zykov
 
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...Andrey Gershun
 
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 27bits
 
High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9HighLoad2009
 
Архитектура Apache Spark
Архитектура Apache SparkАрхитектура Apache Spark
Архитектура Apache SparkRamblerML
 

Similar to Apache spark (20)

Hacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаHacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кода
 
О.В.Сухорослов "MapReduce"
О.В.Сухорослов "MapReduce"О.В.Сухорослов "MapReduce"
О.В.Сухорослов "MapReduce"
 
Expert Fridays Spark Job
Expert Fridays Spark JobExpert Fridays Spark Job
Expert Fridays Spark Job
 
Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Observable как атом приложения
Observable как атом приложенияObservable как атом приложения
Observable как атом приложения
 
Программирование на PySpark
Программирование на PySparkПрограммирование на PySpark
Программирование на PySpark
 
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
Работа с Big Data
Работа с Big Data Работа с Big Data
Работа с Big Data
 
Дополненная Реальность в Облаке
Дополненная Реальность в ОблакеДополненная Реальность в Облаке
Дополненная Реальность в Облаке
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
 
SAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationSAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentation
 
Hadoop implementation in Wikimart
Hadoop implementation in WikimartHadoop implementation in Wikimart
Hadoop implementation in Wikimart
 
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...
AlaSQL библиотека для обработки JavaScript данных (презентация для ForntEnd 2...
 
directx
directxdirectx
directx
 
OpenACC short review
OpenACC short reviewOpenACC short review
OpenACC short review
 
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
 
High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9
 
Архитектура Apache Spark
Архитектура Apache SparkАрхитектура Apache Spark
Архитектура Apache Spark
 

Apache spark

  • 1. Apache Михаил Михайленко, Moneytap/I-Free, 2015 http://spark.apache.org/ http://i-free.com/ http://moneytapp.com/ https://vk.com/sniff303
  • 2. Что это такое? Framework для написания распределенных приложений обрабатывающих данные. Решает задачи: • Map-Reduce, но в памяти (это не означает, что объем данных должен быть меньше чем объем RAM) • Stream Processing
  • 3. Для чего это нужно? • Любые аналитические отчеты, к примеру, как Яндекс.Метрика или Google Analytics • Задачи машинного обучения (классификация, прогнозы...) • …
  • 4. Альтернативы и отличии Spark как альтернатива Hadoop для Map-Reduce • Доступное API на Scala, Python и Java • Не требует очень тяжелой настройки для небольших инсталляций • Выигрывает в скорости, осуществляя процессинг данных, храня их в памяти и вылезая на диск только при необходимости Spark Streaming как альтернатива Apache Storm • Гарантированная обработка каждого события только один раз
  • 5. Как все устроено? Driver Program — часть вашего приложения отвечающего за связь c кластером. Cluster Manager — процесс или группа процессов, осуществляющих распределение ресурсов всего кластера. Worker Node — группа процессов на различных машинах, осуществляют контроль за ресурсами машины, на которой находятся. Executor — процессы, непосредственно исполняющие задачи.
  • 6. Режимы работы • Local • Standalone (+ ZooKeeper) • Hadoop YARN • Apache MESOS
  • 7. Как с этим работать?
  • 9. Resilient Distributed Dataset RDD - Распределенная, неизменяемая коллекция элементов, доступная для параллельной обработки. Она знает как вычислить саму себя в случае сбоя, а так же хранит ссылки на своих предков. Может быть записана на диск. RDD RDD RDD transform transform
  • 10. Загрузка данных в RDD Источники: • Local file system • HDFS • Cassandra • HBase • Amazon S3 Форматы: • Plain text • GZIPpped plain text • Hadoop InputFormat’s JavaRDD<String> localRDD = sparkContext.textFile("/path/data_2015_05_*.txt.gz"); JavaRDD<String> hdfsRDD = sparkContext.textFile("hdfs://...");
  • 11. Операции над RDD Transformations — преобразуют данные из RDD, "лениво" создавая новый RDD. - .map(function) - .flatMap(function) - .filter(function) - .sample(n) - .union(anotherRDD) - .intersection(anotherRDD) - .distinct() - .groupByKey() - .reduceByKey() - .join(anotherRDD) Actions - возвращают результаты в ваше приложение. - .reduce(function) - .collect() - .count() - .take(n) - .takeOrdered(n, comparator) - .foreach(function) Persistence — сохранение RDD. - .saveAs...() - .persist(memoryLevel) - .unpersist() Map<String, Long> sdkVersions = sparkContext.textFile(filePath) .filter(s -> s.contains("AD_GET")) .map(s -> Extractors.extractSdkVersion(s)) .mapToPair(t -> new Tuple2<>(t._2(), 1L)) .reduceByKey((left, right) -> left + right) .collectAsMap();
  • 12. Общие переменные Broadcast variables — Read-only переменные, значение которых доступно с любого Executor'а вашей программы. Разъезжаются по кластеру с помощью P2P протокола. Accumulators — Переменные, изменять значения которых можно только путем прибавления к ним какого либо значения. List<Long> largeList = ...; Broadcast<List<Long>> broadcastVar = sparkContext.broadcast(largeList); Accumulator<Long> accum = sparkContext.accumulator(0); public class MapAccumulator implements AccumulatorParam<Map<Long, Long>> { @Override public Map<Long, Long> addAccumulator(Map<Long, Long> m1, Map<Long, Long> m2) { for (Map.Entry<Long, Long> m2entry : m2.entrySet()) { Long m1val = m1.get(m2entry.getKey()); if (m1val == null) { m1val = m2entry.getValue(); } else { m1val += m2entry.getValue(); } m1.put(m2entry.getKey(), m1val); } return m1; } //… }
  • 14. public class SparkExample { public static void main(String... args) { if (args.length < 3) { throw new IllegalArgumentException(); } String date = args[0]; String appId = args[1]; String network = args[2]; final String filePath = String.format("/var/stat/%s/mt/%s/%s/*.ldjson.gz", date, appId, network); SparkConf sparkConfiguration = new SparkConf().setAppName("SparkExample-" + date + "-" + appId + "-" + network); JavaSparkContext sparkContext = new JavaSparkContext(sparkConfiguration); JavaRDD<Tuple3<String, String, Long>> dataForApp = sparkContext.textFile(filePath) .filter(StringFilter.containJsonKeyValue("statisticEventType", "AD_GET")) .map(line -> { JsonExtractor extract = JsonExtractor.from(line); return new Tuple3<>( extract.visitorId(), extract.device(), extract.timestamp() ); }) .setName("SparkExampleRDD") .persist(StorageLevel.MEMORY_ONLY_SER()); Map<String, Long> topDevices = dataForApp.mapToPair(t -> new Tuple2<>(t._2(), 1L)) .reduceByKey((left, right) -> left + right) .top(50, DeviceTupleComparator.instance()) .stream() .collect(Collectors.toMap(Tuple2::_1, Tuple2::_2));
  • 15. JavaRDD<Tuple2<Long, Long>> usersToSessions = dataForApp.mapToPair(t -> new Tuple2<>(t._1(), t._3())) .groupByKey() .flatMap(t -> { Iterator<Long> timestamps = t._2().iterator(); SessionCalculator sessions = SessionCalculator.from(timestamps); if (sessions.isAny()) { return Collections.singletonList( new Tuple2<>(sessions.getCount(), sessions.getApproximateLength())); } else { return Collections.emptyList(); } }); Accumulator<Double> activeUsersAccumulator = sparkContext.accumulator(0.0D); Accumulator<Map<Long, Long>> sessionLengthAccumulator = sparkContext.accumulator(new HashMap<>(), MapAccumulator.get()); Accumulator<Map<Long, Long>> sessionCountAccumulator = sparkContext.accumulator(new HashMap<>(), MapAccumulator.get()); usersToSessions.foreach(t -> { activeUsersAccumulator.add(1.0D); // active users Long count = t._1(); // session count for user Map<Long, Long> map2 = new HashMap<>(); map2.put(count, 1L); sessionCountAccumulator.add(map2); Long minute = t._2(); // session length for user Map<Long, Long> map = new HashMap<>(); map.put(minute, 1L); sessionLengthAccumulator.add(map); });
  • 16. Map<Long, Long> sessionLengthDistribution = sessionLengthAccumulator.value(); Map<Long, Long> sessionCountDistribution = sessionCountAccumulator.value(); Long activeUsers = activeUsersAccumulator.value().longValue(); System.out.printf("topDevices: %s", topDevices); System.out.printf("sessionLengthDistribution: %s", sessionLengthDistribution); System.out.printf("sessionCountDistribution: %s", sessionCountDistribution); System.out.printf("activeUsers: %s", activeUsers); dataForApp.unpersist(true); sparkContext.stop(); } }
  • 17. Запуск кластера Spark в простейшем режиме 1. Скачать и распаковать архив 2. Отредактировать conf/spark-env.sh
 
 3. Отредактировать conf/spark-defaults.conf
 
 4. Запустить master и worker процессы SPARK_MASTER_IP=... SPARK_WORKER_MEMORY=... spark.master=spark://... spark.executor.memory=... $ ./sbin/start-master.sh $ ./bin/spark-class org.apache.spark.deploy.worker.Worker
  • 18. Запуск вашего приложения 1. Запаковать ваш класс в «fat-jar» со всеми зависимостями, кроме библиотек Spark’а. 2. Выполнить $ ./bin/spark-submit --class com.ifree.SparkExample                      spark-example.jar                      2015-05-26                      c87ad063-c38f-4d2d-bbfe-d7ddfec5aab0                      moneytapp
  • 20. Советы при эксплуатации • Иногда ноды падают, используйте Monit для мониторинга и восстановления. • Не используйте Java сериализацию. Никогда. Используйте, к примеру, Kryo.
 • Бейте исходные данные на логические куски. Меньше входной кусок, меньше чтения с диска, меньше время обработки. • Не используйте Enum’ы в ваших Spark приложениях. • Экономьте память, не плодите лишние объекты, старайтесь по возможности переиспользовать их. • SparkSQL, на самом деле, не так удобен, как кажется на первый взгляд. • Нормальный менеджер задач отсутствует*, приготовьтесь иметь дело с CRON’ом или собственными костылями. Другого способа запустить задачу, кроме как через spark-submit — нет. spark.serializer=org.apache.spark.serializer.KryoSerializer