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 — процессы, непосредственно исполняющие задачи.
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;
}
//…
}
20. Советы при эксплуатации
• Иногда ноды падают, используйте Monit для мониторинга и
восстановления.
• Не используйте Java сериализацию. Никогда. Используйте, к примеру,
Kryo.
• Бейте исходные данные на логические куски. Меньше входной кусок,
меньше чтения с диска, меньше время обработки.
• Не используйте Enum’ы в ваших Spark приложениях.
• Экономьте память, не плодите лишние объекты, старайтесь по
возможности переиспользовать их.
• SparkSQL, на самом деле, не так удобен, как кажется на первый
взгляд.
• Нормальный менеджер задач отсутствует*, приготовьтесь иметь дело
с CRON’ом или собственными костылями. Другого способа запустить
задачу, кроме как через spark-submit — нет.
spark.serializer=org.apache.spark.serializer.KryoSerializer