ТОП-7 причин использовать Apache Spark для анализа больших данных и разработки распределенных приложений

Spark, фреймворк, Data Science

В этой статье поговорим про Apache Spark – популярный Big Data фреймворк с открытым исходным кодом для обработки больших массивов данных. Он входит в экосистему проектов Apache Hadoop, однако выгодно отличается от ее других компонентов. Читайте далее, какие ключевые особенности Apache Spark делают его настолько привлекательным для практического применения в Data Science.

Чем хорош Apache Spark: главные преимущества

Одним из наиболее значимых достоинств Apache Spark является его скорость – в отличие от классического Hadoop MapReduce, он позволяет обрабатывать данные непосредственно в оперативной памяти. За счет этого многие задачи по обработке больших данных выполняются быстрее, что особенно важно в машинном обучении (Machine Learning). Однако, это далеко не единственный плюс рассматриваемого фреймворка. С практической точки зрения весьма полезны следующие его свойства, каждое из которых мы подробнее рассмотрим далее:

  • богатый API;
  • широкие функциональные возможности за счет многокомпонентного состава в виде модулей Spark SQL, Spark Streaming, MLLib;
  • отложенные или ленивые вычисления (lazy evaluation);
  • распределенная обработка данных;
  • простые вращения данных при матричных и векторных операциях;
  • легкие преобразования одних структур данных в другие;
  • статус динамично развивающегося open-source проекта с активным профессиональным сообществом.

Богатый API

Apache Spark предоставляет разработчику довольно обширный API, позволяя работать с разными языками программирования: Python, R, Scala и Java. Spark предлагает пользователю абстракцию датафрейма (dataframe), для которых используются объектно-ориентированные методы преобразований, объединения данных, их фильтрации, а также много других полезных возможностей. Также объектный подход позволяет разработчику создавать настраиваемый и повторно используемый код, который можно тестировать с помощью различных специализированных методов и средств, например, отправка параметризованных запросов и создание разных окружений для одних и тех же запросов.

Также возможна интеграция Spark с такими BigData фреймворками, как Apache Kafka и Apache KUDU, а также с СУБД MySQL посредством компонента Spark SQL.

Широкий функционал

Spark обладает довольно широкими функциональными возможностями за счет следующих компонентов:

  • Spark SQL – модуль, который служит для аналитической обработки данных с помощью SQL-запросов;
  • Spark Streaming – модуль, обеспечивающий надстройку для обработки потоковых данных в режиме онлайн;
  • MLib – модуль, предоставляющий набор библиотек машинного обучения.

Ленивые вычисления

Ленивые вычисления (lazy evaluations) позволяют снизить общий объем вычислений и повысить производительность программы за счет снижений требований к памяти. Такие вычисления весьма полезны, поскольку позволяют определять сложную структуру преобразований, представленных в виде объектов. Также можно проверить структуру конечного результата, не выполняя какие-либо промежуточные шаги. Еще Spark автоматически проверяет план выполнения запросов или программы на наличие ошибок. Это позволяет быстро отловить баги и отладить их.

Легкие преобразования

Для поддержки языка Python сообщество Apache Spark выпустило инструмент PySpark, который предлагает модуль Pyspark Shell, связывающий Python API и контекст Spark. Поэтому разработчик Big Data приложения может применять метод toPandas для беспрепятственного преобразования Spark DataFrame в Pandas. Это нужно для того, чтобы более эффективно сохранять обработанные файлы в csv-формат, а также ускорять обработку небольших массивов данных. Приведем пример такого преобразования:

import findspark

findspark.init()

findspark.find()

import pyspark

findspark.find()

from pyspark.sql import SparkSession

import pandas as pd

from pyspark.sql.types import *

conf = pyspark.SparkConf().setAppName('appName').setMaster('local')

sc = pyspark.SparkContext(conf=conf)

spark = SparkSession(sc) data = []

mySchema_3 = StructType([ StructField("col1", StringType(), True),

                         StructField("col2", StringType(), True),

                         StructField("col3", DoubleType(), True)])

data_1 = spark.createDataFrame(data,schema=mySchema_3)

data_1.toPandas()

Метод toPandas позволяет вести работу в памяти после того, как Спарк разбил данные на более мелкие наборы данных. SparkSession.createDataFrame, в свою очередь, позволяет сделать наоборот:

spark = SparkSession.builder.appName('pandasToSparkDF').getOrCreate()

pandas_df = pd.read_csv("test.csv")

mySchema = StructType([ StructField("col1", LongType(), True)\

                       ,StructField("col2", IntegerType(), True)\

                       ,StructField("col3", IntegerType(), True)])

df = spark.createDataFrame(pandas_df,schema=mySchema)

Таким образом, PySpark расширяет функциональность языка Python до операций с массивными наборами данных, ускоряя цикл разработки.

Простые вращения данных

Вращение данных (data pivoting) считается проблемой для многих фреймворков, работающих с большими данными, например, Apache Kaflka или Flink. Как правило, такие операции требуют множества операторов case. Спарк же имеет в своем арсенале простой и интуитивно понятный способ поворота Datafame. Пользователю необходимо всего лишь выполнить операцию groupBy для столбцов с целевым индексом, поворачивая целевое поле для дальнейшего использования в качестве столбцов. Далее можно приступать непосредственно к самому агрегированию. В качестве примера приведем нахождение среднего значения в колонке:

test_data = spark.read.option('header','True').csv('test.csv',sep=';')

test_data test_data.groupby(['col1', 'col2']).agg({'col3':'mean'}).withColumnRenamed("avg(col3)", "col3")

Метод groupBy позволил использовать колонки col1 и col2 в качестве индексов для последующего агрегирования методом agg.

Apache Spark – это фреймворк с открытым исходным кодом

Входя в линейку проектов Apache Software Foundation, Спарк продолжает активно развиваться за счет сообщества разработчиков. Энтузиасты open-source улучшают основной софт и предлагают дополнительные пакеты. Например, в октябре 2017 года была опубликована библиотека обработки нативного языка для Spark. Это избавило пользователя от необходимости применять другие библиотеки или полагаться на медленные пользовательские функции для таких пакетов Python, как Natural Language Toolkit.

Реализация распределенной обработки данных

Наконец, что особенно важно в разработке Big Data приложений, Apache Spark предусматривает распределенную обработку данных, включая концепцию RDD (resilient distributed dataset) – это распределенная структура данных размещаемая в оперативной памяти. Каждый RDD содержит фрагмент данных, распределенных по узлам кластера. За счет этого он является отказоустойчивым: если раздел теряется в результате сбоя узла, он может быть восстановлен из исходных источников.  Таким образом, Спарк сам раскидывает код по всем узлам кластера, разбивает его на подзадачи, создает план выполнения и отслеживает успешность выполнения. В случае сбоя на каком-нибудь из узлов или неуспешном завершении подзадачи, она будет перезапущена автоматически.

В следующей статье мы продолжим разговор про Apache Spark и рассмотрим основные компоненты этого фреймворка.

Освоить Apache Spark на профессиональном уровне для практического использования в своих проектах анализа больших данных, разработки Big Data приложений и прочих прикладных областях Data Science вы сможете на практических курсах по Apache Spark в нашем лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве.

Записаться на курс

Смотреть раcписание

Добавить комментарий

Поиск по сайту