Apache Spark, объяснение ключевых терминов

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Перевод

Как отмечено в статье Survey shows huge popularity spike for Apache Spark:

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

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

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

1. Apache Spark

Apache Spark - это мощный движок с открытым исходным кодом, построенный для скорости, простого использования, сложной аналитики, в котором есть API на Java, Scala, Python, R и SQL. Spark запускает программы до 100 раз быстрее, чем Hadoop MapReduce в памяти или в 10 раз быстрее на диске. Его можно использовать для построения приложений данных как библиотеки или выполнения интерактивного специального анализа данных. Spark включает в себя большое количество библиотек для работы с помощью SQL с датафреймами и датасетами, MLlib для машинного обучения, GraphX для работы с графами и Spark Streaming для обработки данных в режиме реального времени. Вы можете комбинировать эти библиотеки в одном приложении. Кроме того, Spark может работать локально, на Hadoop, Apache Mesos, автономно или в облаке. Он может получить доступ к различным источникам данных, включая HDFS, Apache Cassandra, Apache HBase и S3. 

Первоначально он был разработан в Калифорнийском университете Беркли в 2009 году. Обратите внимание, что создатель Spark Матей Захария с тех пор стал СТО Databricks и преподавателем Массачусетского технологического института. С момента своего выпуска Spark быстро внедряется организациями в широком спектре индустрии. Интернет-гиганты, такие как Netflix, Yahoo и Tencent стремительно быстро внедрили Spark во внутренние процессы, коллективно обрабатывая несколько петабайт данных в кластерах из более чем 8000 узлов. Быстро возникло сообщество в области больших данных с более чем 1000 участниками разработки кода и более чем 187000 участниками в 420 группах Apache Spark Meetups.

2. RDD

Под капотом Apache Spark лежит понятие абстракции данных как распределенного набора объектов. Эта абстракция данных, называется Resilient Distributed Dataset (RDD), позволяет писать скрипты, которые преобразуют эти распределенные наборы данных. 

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

Ниже представлен фрагмент кода Apache Spark, использующий Python и RDD для подсчета количества слов:

Open textFile for Spark Context RDD

text_file = spark.textFile("hdfs://…")

Execute word count

text_file.flatMap(lambda line: line.split())

    .map(lambda word: (word, 1))

    .reduceByKey(lambda a, b: a+b)

3. DataFrame

Как и RDD, DataFrame - это неизменяемая распределенная коллекция данных. В отличии от RDD, данные организованы в именованные столбцы, как таблица в реляционной базе данных. Разработан для того, чтобы сделать обработку больших данных еще проще, датафрейм позволяет разработчикам придавать структуру распределенному набору данных, обеспечивая абстракцию более высокого уровня. Он предоставляет возможность манипулировать данными с помощью API различных языков и делает Spark доступным для более широкой аудитории, помимо специализированных инженеров данных. 

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

Read JSON file and register temp view

context.jsonFile("s3n://…").createOrReplaceTempView("json")

Execute SQL query

results = context.sql("""SELECT * FROM people JOIN json …""")

4. Dataset

Представленный в Spark 1.6 Spark Dataset предоставляет API, с помощью которого пользователи могут легко выражать преобразования на объектах, а также повышает производительность и преимущества надежного механизма выполнения Spark SQL. 

Обратите внимание, что начиная со Spark 2.0 API DataFrame будет объединено с API Dataset, что позволит использовать больше подходов в обработке данных. Из-за унификации разработчикам теперь требуется изучать меньшее количество документации и они работают с одним высокоуровневым и безопасным API называемым Dataset. Концептуально Spark DataFrame - это псевдоним для коллекции универсальных объектов Dataset [Row], где Row - это универсальный нетипизированный объект JVM. Dataset, напротив, представляет собой коллекцию сильно типизированных объектов JVM, заданный вами классом на Scala или Java. 

case class Person (email: String, iq: Long, name: String)

// Прочитать JSON файл и конвертировать его в Dataset используя класс

val ds = spark.read.json("…").as[Person]

5. MLlib

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

С самого начала проекта Apache Spark MLlib считался основополагающим для успеха Spark. Ключевое преимущество MLlib заключается в том, что она позволяет саентистам сосредоточиться на задачах и моделях вместо того, чтобы решать сложности, связанные с распределенными данными (такими как инфраструктура, конфигурации и так далее). Инженеры данных могут сосредоточиться на разработке распределённых систем с помощью простых в использовании API Spark, в то время как саентисты могут использовать масштаб и скорость ядра Spark. Не менее важно и то, что Spark MLlib - это библиотека общего назначения, предоставляющая алгоритмы для большинства сценариев использования, в то же время позволяя сообществу развивать и расширять ее для специализированных сценариев. Чтобы ознакомиться с ключевыми терминами машинного обучения, пожалуйста, ознакомьтесь с Machine Learning Key Terms, Explained Мэтью Майо. 

6. ML Piplines

Обычно запуск алгоритмов машинного обучения включает в себя последовательность задач, включая предварительную обработку данных, извлечение признаков, обучение модели и этапы валидации. Например, классификация текстовых документов может включать в себя сегментацию и очистку текста, извлечение признаков и обучение классификационной модели с кросс-валидацией. Хотя есть много библиотек, которые мы можем использовать для каждого этапа, соединить все этапы воедино не так просто, как может показаться, особенно с огромными наборами данных. Большинство библиотек машинного обучения не предназначено для распределённых вычислений или не обеспечивают возможность создания и поддержки пайплайна. 

ML Piplines - это высокоуровневое API для MLlib, которое находится в пакете «spark.ml». Пайплайн состоит из последовательных этапов. Существует два основных этапа пайплайна: трансформация и оценивание. Трансформация заключается в сборе данных и выдаче подготовленного набора данных. Например, токенизатор - это трансформатор, который преобразует набор данных с текстом в набор данных с токенизированными словами. Оценивание должно сначала произойти на входном наборе данных, чтобы создать модель, которая является трансформатором, преобразующим входной набор данных. Например, логистическая регрессия - это алгоритм, который обучается на наборе данных с метками и признаками, а затем создает логистическую регрессивную модель. 

7. GraphX

GraphX является компонентом Apache Spark для графов и параллельных графовых вычислений. На высоком уровне GraphX расширяет Spark RDD с помощью абстракции Graph: ориентированного мультиграфа со свойствами, закрепленными на каждой вершине и ребре. Для обеспечения вычислений графов GraphX предоставляет набор фундаментальных операторов (например, subgraph, joinVerticles и aggregateMessages), а также оптимизированный вариант Pregel API. Кроме того, GraphX включает в себя растущую коллекцию алгоритмов и конструкторов графов для упрощения задач аналитики графов. 

8. Spark Streaming

Spark Streaming - это расширение ядра Spark Api, которое позволяет инженерам данных и саентистам работать с данными в режиме реального времени из различных источников данных, включая (но не ограничиваясь) Kafka, Flume и Amazon Kinesis. Эти обработанные данные могут быть отправлены в файловые системы, базы данных и дашборды. Его ключевой абстракцией является является дискретный поток, или короче говоря, DStream, который представляет собой поток данных, разделенный на небольшие части. DStream построен на RDD, основной абстракции Spark. Это позволяет Spark Streaming легко интегрироваться с любыми другими компонентами Spark, такими как MLlib и Spark SQL. 

Такое объединение разрозненных возможностей обработки данных является ключевой причиной быстрого внедрения Spark Streaming. Это позволяет разработчикам очень легко использовать единый фреймворк для удовлетворения всех своих потребностей в обработке. 

9. Structured Streaming 

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

10. spark-packages.org 

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

Пакеты Spark включают в себя интеграцию с различными источниками данных, инструментами управления, библиотеками более высокого уровня, специфичными доменными библиотеками, алгоритмами машинного обучения, примерами кода и другим контентом Spark. Примеры пакетов включают в себя Spark-CSV (который теперь включен в Spark 2.0) и пакеты интеграции Spark ML, включая GraphFrames и TensorFrames. 

11. Catalyst Optimizer

Spark SQL является одним из наиболее технически задействованным компонентом Apache Spark. Он поддерживает как SQL-запросы, так и DataFrame API. В основе Spark SQL лежит оптимизатор Catalyst, который использует расширенные функции языка программирования (например, соответсвует шаблонам Scala и квазицитаты), является новым способом создания расширяемого оптимизатора запросов. 

Catalyst основан на конструкциях функционального программирования Scala и разработан с учетом этих двух целей:

  1. Легкость добавления новых методов и функций оптимизации Spark SQL. 

  2. Предоставление возможности внешним разработчикам расширять оптимизатор (например, добавление правил, новых источников данных, поддержка новых типов данных и т.д.)

Кроме того, Catalyst поддерживает оптимизацию как в целях скорости работы, так и в целях использования ресурсов. 

Для получения дополнительной информации ознакомьтесь с Deep Dive into Spark SQL’s Catalyst Optimizer и вебинаром Apache Spark DataFrames: Simple and Fast Analysis of Structured Data.

12. Tungsten 

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

  1. Управление памятью и двоичная обработка: использование семантики приложений для контролируемого управления памятью и устранения излишних расходов на объектную модель JVM и сбор мусора. 

  2. Вычисления с учетом кэша: алгоритмы и структуры данных для использования иерархии памяти

  3. Генерация кода: использование генерации кода для современных компиляторов и процессоров

  4. Никаких диспетчеризаций виртуальных функций: это уменьшает количество вызовов ЦП, которые могут оказать глубокое влияние на производительность при отправке миллиарды раз

  5. Промежуточные данные в памяти против регистров ЦП: Tungsten Phase 2 помещает промежуточные данные в регистры ЦП. Это на порядок сокращает количество циклов для получения данных из регистров ЦП, а не из памяти

  6. Разворачивание циклов и SIMD: Оптимизирует механизм выполнения Apache Spark, чтобы использовать преимущества современных компиляторов и способности процессоров эффективно компилировать и выполнять простые циклы (в отличии от сложных графиков вызов функций)

Для получения дополнительной информации ознакомьтесь с Project Tungsten: Bringing Apache Spark Closer to Bare Metal, Deep Dive into Spark SQL’s Catalyst Optimizer и Apache Spark as a Compiler: Joining a Billion Rows per Second on a Laptop.

13. Continuous Applications

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

Таким образом, вы можете создавать комплексные непрерывные приложения, в которых возможно выполнять те же запросы к пакетной обработке данных в режиме реального времени, выполнять ETL, генерировать отчеты, обновлять или отслеживать конкретные данные в потоке. Эта комбинированная пакетная обработка и возможность создания запросов в режиме реального времени к структурированному потоку является уникальной возможностью, немногие потоковые движки предлагают подобное. 

Источник: https://habr.com/ru/post/592067/


Интересные статьи

Интересные статьи

Введение Во время работы над задачами машинного обучения с онлайн-данными есть необходимость собирать различные сущности в одну для дальнейшего анализа и оценки. Процесс сбора должен быт...
Принято считать, что персонализация в интернете это магия, которая создается сотнями серверов на основе БигДата и сложного семантического анализа контента.
Получить трафик для интернет-магазина сегодня не проблема. Есть много каналов его привлечения: органическая выдача, контекстная реклама, контент-маркетинг, RTB-сети и т. д. Вопрос в том, как вы распор...
Мы с ребятами из Datawire недавно вернулись с потрясающих конференций KubeCon и CloudNativeCon в Барселоне. Мы участвовали в 6 выступлениях на KubeCon, раздали на своем стенде кучу классных (бе...
В «1С-Битрикс» считают: современный интернет-магазин должен быть визуально привлекательным, адаптированным для просмотра с мобильных устройств и максимально персонализированным с помощью технологии Бо...