Что такое Apache Spark?
Apache Spark - это механизм распределенной обработки данных в памяти, который используется для обработки и анализа больших наборов данных. Spark предоставляет пользователю простой интерфейс для выполнения распределенных вычислений на всех кластерах.
Spark не имеет собственных файловых систем, поэтому для обработки данных он должен зависеть от систем хранения. Он может работать в HDFS или облачных файловых системах, таких как Amazon S3 и Azure BLOB .
Помимо облачных файловых систем, он также может работать с базами данных NoSQL, такими как Cassandra и MongoDB .
Задания Spark можно писать на Java, Scala, Python, R и SQL. Он предоставляет готовые библиотеки для машинного обучения, обработки графиков, потоковой передачи и обработки данных, например SQL. Мы подробно рассмотрим каждую из этих библиотек позже в статье.
Движок был разработан в AMPLab Калифорнийского университета в Беркли и передан в дар Apache Software Foundation в 2013 году.
Потребность в искре
Традиционный способ обработки данных в Hadoop - это использование егоинфраструктуры MapReduce . MapReduce требует значительного использования диска и, как следствие, медленнее. Поскольку аналитика данных стала более распространенной, создатели почувствовали необходимость ускорить обработку за счет уменьшения использования диска во время выполнения заданий.
Apache Spark решает эту проблему, выполняя вычисления в основной памяти (ОЗУ) рабочих узлов и не сохраняя промежуточные результаты вычислений на диске.
Во-вторых, он фактически не загружает данные, пока они не потребуются для вычислений. Он преобразует заданный набор команд в направленный ациклический граф ( DAG ), а затем выполняет его. Это предотвращает необходимость чтения данных с диска и обратной записи вывода каждого шага, как в случае с Hadoop MapReduce . В результате Spark утверждает, что обрабатывает данные в 100 раз быстрее, чем соответствующее задание, использующее MapReduce для вычислений в памяти.
Архитектура Spark
[Кредит: https://spark.apache.org/]{.small}
Spark Core использует архитектуру главный-подчиненный. Программа драйвера запускается на главном узле и распределяет задачи между Executor, работающим на различных подчиненных узлах. Executor работает на своих собственных отдельных JVM, которые выполняют назначенные им задачи в нескольких потоках.
С каждым исполнителем также связан кеш. Кеши могут быть как в памяти, так и записаны на диск на рабочем узле . Исполнители выполняют задачи и отправляют результат обратно водителю .
Драйвер взаимодействует с узлами в кластерах с помощью диспетчера кластеров, такого как встроенный диспетчер кластеров, Mesos , YARN и т. Д. Пакетные программы, которые мы пишем, выполняются в узле драйвера.
Простое задание Spark с использованием Java
Мы много обсуждали Spark и его архитектуру, поэтому теперь давайте посмотрим на простое задание Spark, которое подсчитывает сумму чисел, разделенных пробелами, из заданного текстового файла:
32 23 45 67 2 5 7 9
12 45 68 73 83 24 1
12 27 51 34 22 14 31
...
Мы начнем с импорта зависимостей для Spark Core, который содержит механизм обработки Spark. У него нет дополнительных требований, так как он может использовать локальную файловую систему для чтения файла данных и записи результатов:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>2.2.3</version>
</dependency>
После настройки ядра приступим к написанию нашей партии Spark!
public class CalculateFileSum {
public static String SPACE_DELIMITER = " ";
public static void main(String[] args) {
SparkConf conf = new parkConf().setMaster("local[*]").setAppName("SparkFileSumApp");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> input = sc.textFile("numbers.txt");
JavaRDD<String> numberStrings = input.flatMap(s -> Arrays.asList(s.split(SPACE_DELIMITER)).iterator());
JavaRDD<String> validNumberString = numberStrings.filter(string -> !string.isEmpty());
JavaRDD<Integer> numbers = validNumberString.map(numberString -> Integer.valueOf(numberString));
int finalSum = numbers.reduce((x,y) -> x+y);
System.out.println("Final sum is: " + finalSum);
sc.close();
}
}
Запуск этого фрагмента кода должен дать:
Final sum is: 687
Созданный JavaSparkContext
объект JavaSparkContext действует как
соединение с кластером. Созданному здесь контексту Spark были выделены
все доступные локальные процессоры, поэтому *
.
Самая основная абстракция в Spark - это RDD
, что означает устойчивые
распределенные наборы данных . Он устойчив и распределен, поскольку
данные реплицируются по кластеру и могут быть восстановлены в случае
сбоя любого из узлов.
Еще одно преимущество распределения данных состоит в том, что их можно обрабатывать параллельно, что способствует горизонтальному масштабированию. Еще одна важная особенность RDD - их неизменность. Если мы применим какое-либо действие или преобразование к данному RDD, результатом будет другой набор RDD.
В этом примере мы прочитали слова из входного файла как RDD
и
преобразовали их в числа. Затем мы применили к ним reduce
чтобы
суммировать значения каждого из RDD перед их отображением на консоли.
Введение в библиотеки Spark
Spark предоставляет нам ряд встроенных библиотек, которые работают поверх Spark Core.
Spark SQL
Spark SQL предоставляет SQL-подобный интерфейс для обработки структурированных данных. Когда пользователь выполняет SQL-запрос, внутри пакетное задание запускается Spark SQL, который манипулирует RDD в соответствии с запросом.
Преимущество этого API заключается в том, что тем, кто знаком с запросами в стиле РСУБД, легко перейти на Spark и написать задания в Spark.
Spark Streaming
Spark Streaming подходит для приложений, которые обрабатывают потоки данных в реальном времени, например, обрабатывают каналы Twitter.
Spark может интегрироваться с Apache Kafka и другими инструментами потоковой передачи для обеспечения отказоустойчивой и высокопроизводительной обработки потоковых данных.
Spark MLlib
MLlib - это сокращение от библиотеки машинного обучения, которую предоставляет Spark. Он включает в себя общие алгоритмы обучения, такие как классификация, рекомендации, моделирование и т. Д., Которые используются в машинном обучении.
Эти алгоритмы можно использовать для обучения модели в соответствии с базовыми данными. Благодаря чрезвычайно быстрой обработке данных, поддерживаемой Spark, модели машинного обучения можно обучить за относительно более короткий период времени.
GraphX
Как видно из названия, GraphX - это Spark API для обработки графиков и выполнения вычислений, параллельных графам.
Пользователь может создавать графики и выполнять такие операции, как объединение и преобразование графиков. Как и MLlib, Graphx поставляется со встроенными графическими алгоритмами для ранжирования страниц, количества треугольников и т. Д.
Заключение
Apache Spark является предпочтительной платформой из-за его молниеносной скорости обработки данных, простоты использования и отказоустойчивых функций.
В этой статье мы на примере рассмотрели архитектуру Spark и в чем секрет его молниеносной скорости обработки. Мы также ознакомились с популярными библиотеками Spark и их функциями.