На момент написания этой статьи Spark - лучший проект с открытым исходным кодом для инженеров по машинному обучению или специалистов по данным, интересующихся большими данными.

Зачем вообще нам нужен Spark?

Сама картинка ниже говорит все о том, зачем нам Spark.

Если мы посмотрим на картинку выше, то огромное количество данных, генерируемых каждый час и обрабатывающих эти данные на компьютере, не имеет никакого смысла, потому что данные большие и не помещаются на компьютере в первую очередь. Итак, нам нужен механизм для обработки огромных данных и извлечения из них информации. Более того, программное обеспечение, разработанное за последние 20–30 лет, не масштабируется для обработки этих данных, и Apache Spark был разработан для такого рода задач.

Что такое Apache Spark?

Судя по документации Spark, Apache Spark - это быстрая и универсальная кластерная вычислительная система. Итак, давайте сломаем это определение и разберемся, что это такое.

Ранее мы узнали, что на одном компьютере недостаточно ресурсов для обработки больших объемов данных, но большая группа компьютеров может предоставить достаточно ресурсов вместе, поскольку они были единой системой. Но одной группы компьютеров недостаточно. но также требуется структура для координации работы между собой. Таким образом, Spark делает именно это, управляя и координируя выполнение задач с данными в кластере компьютеров.

Он предоставляет API высокого уровня в Java, Scala, Python и R. Он также поддерживает набор инструментов более высокого уровня, включая Spark SQL для SQL и обработки структурированных данных, MLlib для машинного обучения, GraphX Для обработки графиков и Spark Streaming .

Где изначально запускался Spark?

Первоначально Spark был основан Матей Захария, и это был академический проект в Калифорнийском университете в Беркли. Позже был открыт исходный код, и пока поездка была исключительной.

Компоненты Spark

Ядро Spark:

который позаботится о функциональности искры, планировании задач и обеспечит восстановление после сбоев и управление памятью.

Spark SQL:

Spark SQL обеспечивает способ работы со структурированными данными и позволяет извлекать данные с помощью команд SQL.

Потоковая передача Spark:

Spark Streaming предоставляет способ работы с данными потоковой передачи в реальном времени, при котором мы должны обрабатывать данные в реальном времени.

MLlib (машинное обучение):

Библиотека MLlib предоставляет алгоритмы машинного обучения, в которых у нас есть классификация, регрессия и кластеризация, а также другие алгоритмы, которые масштабируются до большого количества данных.

GraphX:

GraphX ​​- это библиотека для управления графами (например, графом друзей в социальной сети) и выполнения вычислений, параллельных графам.

Диспетчер кластеров:

Кластер компьютеров, которые Spark будет использовать для выполнения задач, управляется менеджером кластера, таким как автономный менеджер кластера Spark, YARN или Mesos. Затем мы отправляем приложения Spark этим менеджерам кластеров, которые предоставят ресурсы нашему приложению, чтобы мы могли завершить нашу работу.

Особенности Spark

1.Быстро:

До Spark у нас была среда Hadoop, которая использовалась для сохранения данных на диске после каждого задания, что увеличивало накладные расходы на операции дискового ввода-вывода, операции сетевого ввода-вывода, поэтому для выполнения другого задания нам нужно снова прочитать disk для выполнения работы, которая увеличивает накладные расходы на дисковый ввод-вывод, тогда как Spark обеспечивает абстракцию кэширования в памяти, что делает Spark идеальным для рабочих нагрузок, когда несколько операций обращаются к одним и тем же входным данным.

2. Ленивая оценка.

Еще один важный аспект Spark - Ленивая оценка, в котором Spark ничего не делает, пока не вызовет действие . Не беспокойтесь о Действиях, мы определим их формально в следующих разделах

Spark создает DAG (направленный ациклический граф), также называемый графом происхождения, всех операций, которые вы выполняете над входом. Выполнение графа начинается только тогда, когда над входом выполняется действие.

1. list1 = list.map(i -> i + 3) // Transformation1
2. list2 = list1.map(i -> i - 3) // Transformation1
3. list3 = list1.map(i -> i + 1) // Transformation1
4. list3.collect()               // ACTION

Не беспокойтесь о синтаксисе, я буду ломать вам каждую строчку кода.

  1. Первая строка кода, добавляющая значение 3 каждому элементу в списке.
  2. Вторая строка, вычитающая значение 3 из каждого элемента
  3. Третий фрагмент кода добавляет значение 1 к каждому элементу в списке.

Допустим, у нас есть 100 миллионов чисел внутри списка, и каждая операция занимает 1 минуту времени, поэтому для выполнения вышеуказанных 3 операций потребуется 3 минуты времени, чтобы получить желаемый результат.

Теперь, используя ленивое вычисление, Spark может выяснить, что эти три преобразования можно объединить вместе в одно преобразование, подобное этому.

list3=list.map(i-> i + 1)

3.Форматы ввода:

Spark поддерживает множество форматов ввода для чтения данных из различных источников. Он поддерживает различные форматы, такие как JSON, Hive и Cassandra, помимо обычных форматов, таких как текстовые файлы, таблицы CSV и RDBMS.

Архитектура приложения Spark

Приложения Spark будут иметь архитектуру главный-подчиненный, и каждое приложение будет иметь драйвер и набор исполнителей. Драйвер приложения Spark сохранит следующую информацию.

  1. поддержание информационного искра приложения
  2. анализ, распределение и планирование работы исполнителей.

Исполнители выполнят порученную водителем работу. Исполнитель сделает две вещи.

  1. выполнить поставленную водителем задачу
  2. сообщение вывода водителю.

Перегородки

Чтобы обеспечить параллелизм с исполнителями, Spark разбивает данные на фрагменты, называемые разделами. Раздел - это не что иное, как набор записей. Параллелизм Spark зависит от количества разделов и исполнителей, которые у нас есть. Если у нас много разделов с одним исполнителем, это не обеспечивает параллелизма и наоборот.

Apache Spark RDD:

RDD означает «Устойчивый распределенный набор данных». Это фундаментальная структура данных Apache Spark. RDD в Apache Spark - это неизменный набор объектов, который вычисляется на разных узлах кластера.

  • Устойчивый: отказоустойчивый с помощью графа родословной RDD (DAG) и, следовательно, способный пересчитывать недостающие или поврежденные разделы из-за сбоев узлов.
  • Распределенный: поскольку данные находятся на нескольких узлах (рабочих узлах).
  • Набор данных представляет собой записи данных, с которыми вы работаете.

Операции Spark RDD:

Преобразования

RDD в Spark неизменяемы, то есть их нельзя изменить после создания.

Преобразования - это своего рода операции, которые превратят ваш RDD в другой RDD. А когда вы примените любую операцию к вводу, вы получите новый RDD с преобразованными данными. Такие операции, как map, filter, являются преобразованиями.

rdd=sc.parallelize([1,2, 3, 4,5,6,7,8,9,10])
map_rdd=rdd.map(lambda x : x * x) # squaring each number
filter_rdd=rdd.filter(lambda x : x%2==0) # filtering even numbers

Обратите внимание, что эти преобразования не возвращают никаких результатов. Это потому, что мы указали только абстрактное преобразование, и Spark не будет воздействовать на преобразования, пока мы не вызовем действие. Spark построит график с преобразованиями и произведет оптимизацию для эффективного достижения результата [мы видели простой пример выше]

Преобразования - это основа того, как мы выражаем нашу бизнес-логику с помощью Spark. Существует два типа преобразований: те, которые задают узкие зависимости, и те, которые задают широкие зависимости.

Узкие преобразования:

Узкие преобразования можно описать как то, для какого входного раздела он точно даст один выходной раздел. В приведенном выше примере операция «map» является примером узкого преобразования, в котором каждый раздел дает ровно один раздел вывода.

Более широкое преобразование:

При широком преобразовании входные разделы будут использоваться во многих выходных разделах. с широкими преобразованиями мы не можем выполнять конвейерную обработку (применение последовательности операций), поэтому мы должны записывать результаты обратно на диск и загружать их снова после их записи на диск.

Заключение:

В этой статье мы обсудили основы Apache Spark. Я рассказал о преобразованиях и действиях, а также о том, как Spark лениво выполняет DAG преобразований, чтобы оптимизировать план выполнения. Мы также обсудили, как данные организованы в разделы. В следующей статье я расскажу больше о Структурированном API - SQL, DataFrames и наборах данных.

Удачного обучения

Использованная литература:

1. https://spark.apache.org/docs/latest/



2. https://www.edureka.co/blog/spark-tutorial/

3. https://data-flair.training/blogs/spark-rdd-tutorial/

4. https://mapr.com/blog/spark-101-what-it-what-it-does-and-why-it-matters/