Что такое Apache Spark? Платформа больших данных, сокрушившая Hadoop

Определение Apache Spark

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

Со своего скромного начала в AMPLab в Калифорнийском университете в Беркли в 2009 году Apache Spark стал одной из ключевых сред распределенной обработки больших данных в мире. Spark можно развернуть различными способами, он предоставляет собственные привязки для языков программирования Java, Scala, Python и R, а также поддерживает SQL, потоковую передачу данных, машинное обучение и обработку графиков. Вы обнаружите, что его используют банки, телекоммуникационные компании, игровые компании, правительства и все крупные технологические гиганты, такие как Apple, Facebook, IBM и Microsoft.

Архитектура Apache Spark

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

По умолчанию Spark может работать в автономном режиме кластера, для которого просто требуется инфраструктура Apache Spark и JVM на каждой машине в кластере. Однако более вероятно, что вы захотите воспользоваться преимуществами более надежной системы управления ресурсами или кластером, чтобы распределять сотрудников по запросу для вас. На предприятии это обычно означает работу на Hadoop YARN (именно так дистрибутивы Cloudera и Hortonworks запускают задания Spark), но Apache Spark также может работать на Apache Mesos, Kubernetes и Docker Swarm.

Если вам нужно управляемое решение, Apache Spark можно найти в составе Amazon EMR, Google Cloud Dataproc и Microsoft Azure HDInsight. Databricks, компания, в которой работают основатели Apache Spark, также предлагает платформу унифицированной аналитики Databricks, которая представляет собой комплексную управляемую службу, которая предлагает кластеры Apache Spark, поддержку потоковой передачи, интегрированную разработку портативных компьютеров на основе веб-технологий и оптимизированную производительность ввода-вывода в облаке. стандартный дистрибутив Apache Spark.

Apache Spark объединяет команды обработки данных пользователя в направленный ациклический граф или DAG. DAG - это уровень планирования Apache Spark; он определяет, какие задачи выполняются на каких узлах и в какой последовательности.  

Spark против Hadoop: зачем использовать Apache Spark?

Стоит отметить, что использование Apache Spark и Apache Hadoop несколько неверно. В наши дни вы найдете Spark включенным в большинство дистрибутивов Hadoop. Но благодаря двум большим преимуществам Spark стал предпочтительной платформой при обработке больших данных, обогнав старую парадигму MapReduce, которая принесла Hadoop известность.

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

Второе преимущество - удобный для разработчиков Spark API. Каким бы важным ни было ускорение Spark, можно утверждать, что удобство Spark API еще важнее.

Искровое ядро

По сравнению с MapReduce и другими компонентами Apache Hadoop, API Apache Spark очень дружелюбен к разработчикам, скрывая большую часть сложности механизма распределенной обработки за простыми вызовами методов. Каноническим примером этого является то, как почти 50 строк кода MapReduce для подсчета слов в документе могут быть сокращены до нескольких строк Apache Spark (здесь показано в Scala):

val textFile = sparkSession.sparkContext.textFile («hdfs: /// tmp / words»)

val counts = textFile.flatMap (line => line.split («“))

                      .map (слово => (слово, 1))

                      .reduceByKey (_ + _)

counts.saveAsTextFile («hdfs: /// tmp / words_agg»)

Предоставляя привязки к популярным языкам для анализа данных, таким как Python и R, а также к более дружественным к предприятиям Java и Scala, Apache Spark позволяет всем, от разработчиков приложений до специалистов по обработке данных, использовать его масштабируемость и скорость доступным способом.

Spark RDD

В основе Apache Spark лежит концепция Resilient Distributed Dataset (RDD), абстракции программирования, представляющей неизменяемую коллекцию объектов, которые можно разделить по вычислительному кластеру. Операции с RDD также могут быть разделены по кластеру и выполняться в параллельном пакетном процессе, что приводит к быстрой и масштабируемой параллельной обработке.

RDD можно создавать из простых текстовых файлов, баз данных SQL, хранилищ NoSQL (таких как Cassandra и MongoDB), корзин Amazon S3 и многого другого. Большая часть Spark Core API построена на этой концепции RDD, позволяя использовать традиционные функции сопоставления и сокращения, но также обеспечивая встроенную поддержку объединения наборов данных, фильтрации, выборки и агрегирования.

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

Spark SQL

Первоначально известный как Shark, Spark SQL становится все более важным для проекта Apache Spark. Вероятно, это интерфейс, который сегодня чаще всего используется разработчиками при создании приложений. Spark SQL ориентирован на обработку структурированных данных с использованием подхода фреймов данных, заимствованного из R и Python (в Pandas). Но, как следует из названия, Spark SQL также предоставляет совместимый с SQL2003 интерфейс для запросов к данным, предоставляя возможности Apache Spark как аналитикам, так и разработчикам.

Помимо стандартной поддержки SQL, Spark SQL предоставляет стандартный интерфейс для чтения и записи в другие хранилища данных, включая JSON, HDFS, Apache Hive, JDBC, Apache ORC и Apache Parquet, все из которых поддерживаются из коробки. Другие популярные магазины - Apache Cassandra, MongoDB, Apache HBase и многие другие - можно использовать, подключив отдельные соединители из экосистемы Spark Packages.

Выбрать несколько столбцов из фрейма данных так же просто, как в этой строке:

CityDF.select («имя», «поп»)

Используя интерфейс SQL, мы регистрируем фрейм данных как временную таблицу, после чего мы можем выдавать ему SQL-запросы:

citiesDF.createOrReplaceTempView («города»)

spark.sql («ВЫБРАТЬ имя, выбрать из городов»)

За кулисами Apache Spark использует оптимизатор запросов под названием Catalyst, который проверяет данные и запросы, чтобы создать эффективный план запроса для определения местоположения данных и вычислений, который будет выполнять необходимые вычисления в кластере. В эпоху Apache Spark 2.x рекомендуется использовать интерфейс Spark SQL для фреймов данных и наборов данных (по сути, типизированный фрейм данных, который можно проверить во время компиляции на предмет корректности и воспользоваться дополнительной памятью и оптимизацией вычислений во время выполнения). . Интерфейс RDD по-прежнему доступен, но рекомендуется только в том случае, если ваши потребности не могут быть удовлетворены в рамках парадигмы Spark SQL.

Spark 2.4 представил набор встроенных функций высшего порядка для непосредственного управления массивами и другими типами данных высшего порядка.

Spark MLlib

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

Обратите внимание, что хотя Spark MLlib охватывает базовое машинное обучение, включая классификацию, регрессию, кластеризацию и фильтрацию, он не включает средства для моделирования и обучения глубоких нейронных сетей (подробности см. В обзоре Spark MLlib). Однако конвейеры глубокого обучения находятся в разработке.

Spark GraphX

Spark GraphX ​​поставляется с набором распределенных алгоритмов для обработки структур графов, включая реализацию PageRank Google. Эти алгоритмы используют RDD-подход Spark Core к моделированию данных; пакет GraphFrames позволяет выполнять операции с графами над фреймами данных, включая использование оптимизатора Catalyst для запросов к графам.

Spark Streaming

Spark Streaming была ранним дополнением к Apache Spark, которое помогло ему добиться успеха в средах, требующих обработки в реальном времени или почти в реальном времени. Раньше пакетная и потоковая обработка в мире Apache Hadoop были разными вещами. Вы могли бы написать код MapReduce для своих нужд пакетной обработки и использовать что-то вроде Apache Storm для ваших требований к потоковой передаче в реальном времени. Это, очевидно, приводит к разрозненным кодовым базам, которые необходимо синхронизировать для домена приложения, несмотря на то, что они основаны на совершенно разных фреймворках, требуют разных ресурсов и включают разные операционные проблемы для их запуска.

Spark Streaming расширил концепцию пакетной обработки Apache Spark до потоковой передачи, разбив поток на непрерывную серию микропакетов, которыми затем можно было управлять с помощью API Apache Spark. Таким образом, код в пакетных и потоковых операциях может совместно использовать (в основном) один и тот же код, работающий на одной платформе, что сокращает накладные расходы как разработчика, так и оператора. Все выигрывают.

Критика подхода Spark Streaming заключается в том, что микропакетирование в сценариях, где требуется реакция с низкой задержкой на входящие данные, может не соответствовать производительности других платформ с поддержкой потоковой передачи, таких как Apache Storm, Apache Flink и Apache Apex, все они используют метод чистой потоковой передачи, а не микропакеты.

Структурированная потоковая передача

Структурированная потоковая передача (добавленная в Spark 2.x) является для Spark Streaming тем же, чем Spark SQL был для API-интерфейсов Spark Core: API более высокого уровня и более простая абстракция для написания приложений. В случае структурной потоковой передачи высокоуровневый API позволяет разработчикам создавать бесконечные потоки данных и наборы данных. Это также решает некоторые очень реальные проблемы, с которыми пользователи боролись в более ранней структуре, особенно в отношении работы с агрегированием во время события и поздней доставкой сообщений. Все запросы к структурированным потокам проходят через оптимизатор запросов Catalyst и даже могут выполняться в интерактивном режиме, что позволяет пользователям выполнять SQL-запросы к данным потоковой передачи в реальном времени.

Структурированная потоковая передача изначально основывалась на схеме микропакетов Spark Streaming для обработки потоковых данных. Но в Spark 2.3 команда Apache Spark добавила режим непрерывной обработки с малой задержкой в ​​структурированную потоковую передачу, что позволило ему обрабатывать ответы с задержкой всего 1 мс, что очень впечатляет. Начиная с Spark 2.4, непрерывная обработка по-прежнему считается экспериментальной. В то время как структурированная потоковая передача построена на основе механизма Spark SQL, непрерывная потоковая передача поддерживает только ограниченный набор запросов.

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

Конвейеры глубокого обучения

Apache Spark поддерживает глубокое обучение с помощью конвейеров глубокого обучения. Используя существующую структуру конвейера MLlib, вы можете вызывать библиотеки глубокого обучения нижнего уровня и создавать классификаторы всего в нескольких строках кода, а также применять настраиваемые графики TensorFlow или модели Keras к входящим данным. Эти графики и модели можно даже зарегистрировать как пользовательские UDF-функции Spark SQL (определяемые пользователем функции), чтобы модели глубокого обучения можно было применять к данным как часть операторов SQL.

Руководства по Apache Spark

Готовы погрузиться в изучение Apache Spark? Мы настоятельно рекомендуем Эвана Хейтмана «Руководство неандертальца по Apache Spark в Python», в котором не только в относительно простых терминах изложены основы работы Apache Spark, но и проведен процесс написания простого приложения Python, использующего этот фреймворк. . Статья написана с точки зрения специалиста по данным, что имеет смысл, поскольку наука о данных - это мир, в котором большие данные и машинное обучение становятся все более важными.

Если вы ищете несколько примеров Apache Spark, чтобы понять, что может делать платформа и как она это делает, ознакомьтесь с Spark By {Примеры}. Здесь есть множество примеров кода для ряда основных задач, которые составляют строительные блоки программирования Spark, поэтому вы можете увидеть компоненты, составляющие более крупные задачи, для которых создан Apache Spark.

Нужно углубиться? У DZone есть то, что он скромно называет The Complete Apache Spark Collection, который состоит из множества полезных руководств по многим темам Apache Spark. Удачного обучения!