Spark
Apache Spark – это Big Data фреймворк с открытым исходным кодом для распределённой пакетной и потоковой обработки неструктурированных и слабоструктурированных данных, входящий в экосистему проектов Hadoop [1].
История появления Спарк и сравнение с Apache Hadoop
Основным автором Apache Spark считается Матей Захария (Matei Zaharia), румынско-канадский учёный в области информатики. Он начал работу над проектом в 2009 году, будучи аспирантом Университета Калифорнии в Беркли. В 2010 году проект опубликован под лицензией BSD, в 2013 году передан фонду Apache Software Foundation и переведён на лицензию Apache 2.0, а в 2014 году принят в число проектов верхнего уровня Apache. Изначально Спарк написан на Scala, затем была добавлена существенная часть кода на Java, что позволяет разрабатывать распределенные приложения непосредственно на этом языке программирования [1].
Классический MapReduce, Apache компонент Hadoop для обработки данных, проводит вычисления в два этапа:
Очень кратко про Hadoop и Spark
- Map, когда главный узел кластера (master) распределяет задачи по рабочим узлам (node)$
- Reduce, когда данные сворачиваются и передаются обратно на главный узел, формируя окончательный результат вычислений.
Пока все процессы этапа Map не закончатся, процессы Reduce не начнутся. При этом все операции проходят по циклу чтение-запись с жесткого диска. Это обусловливает задержки в обработке информации. Таким образом, технология MapReduce хорошо подходит для задач распределенных вычислений в пакетном режиме, но из-за задержек (latency) не может использоваться для потоковой обработки в режиме реального времени [2]. Для решения этой проблемы был создан Apache Spark и другие Big Data фреймворки распределенной потоковой обработки (Storm, Samza, Flink).
В отличие от классического обработчика ядра Apache Hadoop c двухуровневой концепцией MapReduce на базе дискового хранилища, Spark использует специализированные примитивы для рекуррентной обработки в оперативной памяти. Благодаря этому многие вычислительные задачи реализуются в Спарк значительно быстрее. Например, возможность многократного доступа к загруженным в память пользовательским данным позволяет эффективно работать с алгоритмами машинного обучения (Machine Learning) [1].
Как устроен Apache Spark: архитектура и принцип работы
Спарк состоит из следующих компонентов:
- Ядро (Core);
- SQL – инструмент для аналитической обработки данных с помощью SQL-запросов;
- Streaming – надстройка для обработки потоковых данных, о которой подробно мы рассказывали здесь и здесь;
- MLlib – набор библиотек машинного обучения;
- GraphX – модуль распределённой обработки графов.
Spark может работать как в среде кластера Hadoop под управлением YARN, так и без компонентов ядра хадуп, например, на базе системы управления кластером Mesos. Спарк поддерживает несколько популярных распределённых систем хранения данных (HDFS, OpenStack Swift, Cassandra, Amazon S3) и языков программирования (Java, Scala, Python, R), предоставляя для них API-интерфейсы.
Справедливости ради стоит отметить, что Spark Streaming, в отличие от, например, Apache Storm, Flink или Samza, не обрабатывает потоки Big Data целиком. Вместо этого реализуется микропакетный подход (micro-batch), когда поток данных разбивается на небольшие пакеты временных интервалов. Абстракция Spark для потока называется DStream (discretized stream, дискретизированный поток) и представляет собой микро-пакет, содержащий несколько отказоустойчивых распределенных датасетов, RDD (resilient distributed dataset) [3].
Именно RDD является основным вычислительным примитивом Спарк, над которым можно делать параллельные вычисления и преобразования с помощью встроенных и произвольных функций, в том числе с помощью временных окон (window-based operations) [3]. Подробнее про временные окна мы рассказывали здесь на примере Apache Kafka Streams.
Где и как используется Apache Spark
Благодаря наличию разнопрофильных инструментов для аналитической обработки данных «на лету» (SQL, Streaming, MLLib, GraphX), Спарк активно используется в системах интернета вещей (Internet of Things, IoT) на стороне IoT-платформ, а также в различных бизнес-приложениях, в т.ч. на базе методов Machine Learning. Например, Спарк применяется для прогнозирования оттока клиентов (Churn Predict) и оценки финансовых рисков [4]. Однако, если временная задержка обработки данных (latency) – это критичный фактор, Apache Spark не подойдет и стоит рассмотреть альтернативу в виде клиентской библиотеки Kafka Streams или фреймворков Storm, Flink, Samza.
По набору компонентов и функциональным возможностям Spark можно сравнить с другим Big Data инструментом распределенной потоковой обработки – Apache Flink. Этому детальному сравнению в части потоковых вычислений мы посвятили отдельную статью. А о проблемах Спарк читайте здесь.
Источники
- https://ru.wikipedia.org/wiki/Apache_Spark
- https://dis-group.ru/company-news/articles/6-faktov-ob-apache-spark-kotorye-nuzhno-znat-kazhdomu/
- http://datareview.info/article/obrabotka-potokovyx-dannyx-storm-spark-i-samza/
- https://www.cloudera.com/developers/how-tos/apache-spark-how-tos.html
Источник: bigdataschool.ru
Что такое Spark и с чем его едят?
Spark предоставляет быструю и универсальную платформу для обработки данных. По сравнению с Hadoop Spark ускоряет работу программ в памяти более чем в 100 раз, а на диске – более чем в 10 раз. Spark дает больше возможностей для работы с данными. Его синтаксис не так сложен, чтобы начать погружение, для сравнения приведу пример из Pandas.
Для работы с Spark, нужно создать сессию.
«` spark = SparkSession.builder.getOrCreate() «`
Во время создания сессии, происходит кластеризация.
Pandas «` data = pd.read_csv(‘data.csv’) «« Spark «« data = spark.read.csv(path=’data.csv’, header=True, sep=’,’) ««
Далее, сгруппируем данные и «сместим» в колонке на одну позицию. В Pandas это делается так:
«` data[group1] = pandas_df.groupby(group2)[group3].shift(-1) «`
«` w = Window().partitionBy(«group2»).orderBy(«group3») data = data.withColumn(«group2», lag(«group2», -1, 0).over(w)) «`
Можно использовать оконную функцию, где partitionBy отвечает за группировку данных, а orderBy сортировка. Функция lag принимает 3 параметра: это колонка, шаг смещения и значения, которые будет на месте шага.
Или для группировки можно использовать обычную функцию groupBy, которая тоже есть в Spark. Разница в том, что с окном каждая строка будет связана с результатом агрегирования, вычисленным для всего окна. Однако при группировке каждая группа будет связана с результатом агрегации в этой группе (группа строк становится только одной строкой).
«` dataframe = spark.range(6).withColumn(«key», ‘id % 2) dataframe.show
windowing = Window.partitionBy(«key») dataframe.withColumn(«sum», sum(col(«id»)).over(windowing).show
dataframe.groupBy(«key»).agg(sum(‘id)).show
К сожалению, некоторых функций может не быть в Spark (например, factorize).
«` labels_start, uniques = pd.factorize(anomaly_time[‘activity_start’]) anomaly_time[‘activity_start_code’] = labels_start «` Spark «« win_func = Window().partitionBy().orderBy(lit(‘ ‘)) data = data.select(‘name_column’).distinct().withColumn(‘name_column’, row_number().over(win_func) — 1) ««
Функция factorize закодирует объект как перечислимый тип или категориальную переменную, или присвоит объекту идентификатор.
«` codes, uniques = pd.factorize([‘b’, ‘b’, ‘a’, ‘c’, ‘b’]) codes array([0, 0, 1, 2, 0]. ) «`
Для выполнения подобного функционала в Spark, берется колонка select (‘name_column’) и выбираются все уникальные значения, с помощью функции distinct. Далее с помощью функции withColumn создается колонка и присваивается номер строки (чтобы начиналось с 0 — я отнимаю 1).
Вывод
Apache Spark это огромная система, с множеством инструментов для разных типов задач от SQL до машинного обучения. В этой статье был показан лишь маленький кусочек от всего Spark, но даже этого хватит, чтобы начать обрабатывать данные.
Источник: biconsult.ru