SlideShare a Scribd company logo
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

PDF
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
PDF
Лекция 12. Spark
PDF
08 - Hadoop. Алгоритмы на графах в MapReduce
PDF
13 - Hadoop. Парадигма Spark
PDF
06 - Hadoop. Java API и Hadoop Streaming
PDF
Spark: нетипичные примеры использования
PDF
14 - Hadoop. Фреймворк Spark
PDF
Лекция 10. Apache Mahout
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
Лекция 12. Spark
08 - Hadoop. Алгоритмы на графах в MapReduce
13 - Hadoop. Парадигма Spark
06 - Hadoop. Java API и Hadoop Streaming
Spark: нетипичные примеры использования
14 - Hadoop. Фреймворк Spark
Лекция 10. Apache Mahout

What's hot (20)

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

Viewers also liked (18)

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

Similar to Apache spark (20)

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