Apache Spark — високопродуктивне рішення для обробки даних, що зберігаються в кластері Hadoop. У порівнянні з наданим у Hadoop механізмом MapReduce, Spark забезпечує у 100 разів більшу продуктивність при обробленні даних в пам'яті й 10 разів при розміщенні даних на дисках.[3] Рушій може виконуватися на вузлах кластера Hadoop як за допомогою Hadoop YARN, так і у відокремленому режимі. Підтримується оброблення даних у сховищах HDFS, HBase, Cassandra, Hive та будь-якому форматі введення Hadoop (InputFormat).

Apache Spark
Тип програмний каркас
machine learning frameworkd і хмарні обчислення
Автор Матей Захарія
Розробник Apache Software Foundation
Платформа віртуальна машина Java
Операційна система Windows, Linux і macOS
Мова програмування Scala[1][2], Java[2], Python[2], R[2], SQL[2] і Java Database Connectivity[2]
Стан розробки активний
Ліцензія Apache License, Version 2.0[d] і Ліцензія BSD
Репозиторій https://github.com/apache/spark, https://gitbox.apache.org/repos/asf/spark.git
Вебсайт spark.apache.org

Spark може використовуватися як у типових сценаріях оброблення даних, схожих на MapReduce, так і для реалізації специфічних методів, таких як потокове оброблення, SQL, інтерактивні та аналітичні запити, рішення задач машинного навчання і робота з графами. Програми для оброблення даних можуть створюватися на мовах Scala, Java, Python та R.

Spark після перебування в інкубаторі став первинним проєктом Apache Software Foundation від лютого 2014.

З компаній, котрі використовують Spark, відзначаються Alibaba, Cloudera, Databricks, IBM, Intel, Yahoo, Cisco Systems.

У жовтні 2014 року Apache Spark встановив світовий рекорд при сортуванні 100 терабайт даних.[4]

Згідно з опитуванням O'Reilly, у 2015 році 17 % дослідників даних використовують Apache Spark.[5]

Опис ред.

Застосунок Spark складається з процесу-драйвера (англ. driver process) та багатьох процесів виконавців (англ. executor processes)[6].

Драйвер є серцем застосунку Spark, і виконує наступні функції:

  1. Зберігає та обробляє інформацію про стан застосунку
  2. Відповідає на запити користувацьких програм
  3. Аналізує та розподіляє завдання між виконавцями та порядок їх виконання.

Виконавці натомість виконують завдання та звітують про їх виконання і свій стан драйверу.

Так як драйвер і виконавці є звичайними процесами, Spark може працювати в псевдо-розподіленому локальному режимі (англ. local mode), в якому всі вони запускаються на одному комп'ютері з одним виконавцем на кожне ядро процесора і робота кластера лише емулюється. Це корисно для розробки і тестування. Зазвичай цей режим використовується для розробки або тестування, коли розподілене зберігання не потрібне і натомість використовується локальна файлова система.

Apache Spark потребує для розгортання кластера менеджера кластера[en], який контролює фізичні машини і виділяє ресурси та розподілену систему зберігання[en]. В Spark менеджером може працювати як вбудований менеджер Spark (англ. Spark standalone cluster manager)[7], так і YARN або Apache Mesos.[8] Для розподіленого зберігання, Spark може з'єднуватись з найрізноманітнішими системами, включаючи Hadoop Distributed File System,[9] MapR File System,[10] Cassandra,[11] OpenStack Swift, Amazon S3, Kudu, або реалізацію оригінального рішення.

Spark дозволяє писати запити надаючи API наступними мовами програмування: Scala, Python, Java, SQL та R[6].

  • $SPARK_HOME/bin/spark-shell запускає REPL на Scala
  • $SPARK_HOME/bin/pyspark запускає REPL на Python

API до процесу драйвера називається сесією Spark (англ. Spark Session) і доступне як змінна spark в оболонках для Scala та Python[6].

DataFrame ред.

Основна структура даних з якою працює Spark — DataFrame. Вона містить таблицю яка складається з рядків та колонок. Список колонок та їхніх типів називають схемою (яку можна подивитись викликавши метод df.printSchema()). Аналогічні структури даних є в мові R та бібліотеці pandas, але в Spark він відрізняється тим що є розподіленим на кілька розділів (англ. partitions). Розділ — це набір рядків DataFrame на одній фізичній машині кластеру[6].

DataFrame в Spark — незмінні, але до нього можна застосувати перетворення (англ. transformations) щоб утворити новий DataFrame. Наприклад:

evenRows = myData.where("number % 2 = 0") # утворюємо DataFrame evenRows з датафрейму myData

Перетворення ліниві, і не виконуються, а лише додаються до плану обчислень доти, доки користувач не попросить про якусь дію (англ. action). Дія може вивести дані в консоль, файл чи базу даних, або зібрати їх в об'єкти мови якою писали запит. Приклад дії — evenRows.count() — підрахунок кількості рядків в DataFrame[6].

Дія запускає завдання (англ. job), яке виконує всі необхідні перетворення та дію згідно оптимізованого плану обчислень. Процес виконання завдання можна моніторити з вебінтерфейсу користувача Spark, який знаходиться за адресою http://localhost:4040/ в локальному режимі, або на вузлі кластера на якому запущений драйвер.

SparkSQL ред.

Крім методів об'єкта DataFrame з даними можна працювати за допомогою Spark SQL[6]. Для цього Spark може створити з DataFrame розріз даних (віртуальну таблицю). Це робиться викликом:

myDataFrame.createOrReplaceTempView("назва_таблиці")

Після чого можна виконати запит в REPL, через метод sql об'єкта сесії:

spark.sql("SELECT ... FROM назва_таблиці ...")

RDD ред.

API Apache Spark зосереджено навколо структури даних, яка називається пружні розподілені набори даних (англ. resilient distributed dataset, RDD), відмовостійка мультимножина елементів даних, яку можна лише читати, розподілена понад кластером машин.[12] Вона була розроблена у відповідь на обмеження парадигми програмування MapReduce, яка нав'язує певну лінійну структуру потоку даних[en] для розподіленої програми: програми MapReduce читають вхідні дані з диска, застосовують до всіх даних map()[en], згортають[en] результати застосування map() і зберігають результат на диску. RDDs в Spark функціонують як working set[en] для розподілених програм, який надає обмежену (навмисне) форму розподіленої спільної пам'яті.[13]

Доступність RDD підтримує реалізацію як ітеративних алгоритмів, які звертаються до даних багато разів в циклі, так і інтерактивного розвідувального аналізу, тобто повторювані запити до даних як у СКБД. Латентність[en] таких застосунків (порівняно з реалізаціями на MapReduce, які типові для стеку Apache Hadoop) може бути меншою на кілька порядків.[12][14] До класу ітеративних алгоритмів входять тренувальні алгоритми систем машинного навчання, використання яких є першопричиною розробки Apache Spark.[15]

Spark Core ред.

Spark Core це основа всього проєкту. Він надає диспетчеризацію задач, планування, та базовий ввід/вивід, які надаються через прикладний програмний інтерфейс (для Java, Python, Scala, та R) зосереджений навколо абстракції RDD (Java API доступне для інших мов JVM, але може також використовуватись деякими не-JVM мовами, такими як Julia,[16] які можуть приєднуватись до JVM). Цей інтерфейс мавпує функційну модель програмування вищого порядку: програма «драйвер» активує паралельні операції, такі як map, filter або reduce над RDD передаючи функцію Spark, який визначає графік виконання функції на кластері.[12] Ці операції, і додаткові, такі як Join-и, приймають RDD як вхідні дані та утворюють нові RDD. RDD незмінні, а операції над ними ліниві; стійкість до відмов забезпечується запам'ятовуванням походження кожного RDD (як послідовності операцій, якими його отримано), щоб у випадку втрати даних його можна було обчислити наново. RDD можуть містити будь-який тип об'єктів Python, Java, чи Scala.

Окрім функціонального стилю програмування з RDD, Spark надає два обмежені види спільних змінних: широкомовні змінні (англ. broadcast variables) стосуються даних лише для читання, які мають бути доступними на всіх вузлах, та акумулятори (англ. accumulators), які можна використовувати для програмування агрегації в імперативному стилі.[12]

Типовим прикладом функційного програмування, яке зосереджується на RDD є наступна програма на Scala яка обчислює частоти всіх слів, що зустрічаються в наборі текстових файлів і роздруковує ті, що трапляються найчастіше. Кожна map, flatMap (варіант map) та reduceByKey приймає анонімну функцію, що виконує просту операцію над одним елементом даних (або парою елементів), і використовує її щоб перетворити RDD в новий RDD.

val conf = new SparkConf().setAppName("wiki_test") // створити об'єкт конфігурації Spark
val sc = new SparkContext(conf) // Створити spark context
val data = sc.textFile("/шлях/до/якоїсь директорії") // Прочитати файли з "якоїсь директорії" в RDD що складається з пар (назва файлу, вміст).
val tokens = data.flatMap(_.split(" ")) // Розділити кожен файл на список токенів (слів). 
val wordFreq = tokens.map((_, 1)).reduceByKey(_ + _) // Присвоїти кількість 1 кожному токену, а тоді підрахувати суми для кожного окремого слова.
wordFreq.sortBy(s => -s._2).map(x => (x._2, x._1)).top(10) // Отримати найпопулярніші 10 слів. Переставити слово і частоту аби відсортувати за частотою.

Spark SQL ред.

Компонент Spark SQL працює поверх Spark Core та забезпечує абстракцію над даними — DataFrames (її до виходу версії Spark 1.3 називали SchemaRDDs[17]), що надає підтримку структурованих та напівструктурованих даних[en]. Spark SQL надає предметно-орієнтовану мову (DSL) для маніпуляції датафреймами в Scala, Java, чи Python. Також додає підтримку мови SQL, з інтерфейсом командного рядка та ODBC/JDBC серверами. Хоча датафреймам бракує перевірки типів на етапі компіляції яка доступна для RDD, починаючи з Spark 2.0, Spark SQL також підтримує строго типізований DataSet.

import org.apache.spark.sql.SQLContext

val url = "jdbc:mysql://yourIP:yourPort/test?user=yourUsername;password=yourPassword" // URL для сервера бази даних.
val sqlContext = new org.apache.spark.sql.SQLContext(sc) // Створити об'єкт sql контексту

val df = sqlContext
  .read
  .format("jdbc")
  .option("url", url)
  .option("dbtable", "people")
  .load()

df.printSchema() // Показує схему DataFrame.
val countsByAge = df.groupBy("age").count() // Рахує кількість людей кожного віку

Spark Streaming ред.

Spark Streaming використовує можливість швидкого планування Spark Core щоб здійснювати потокову аналітику. Він споживає дані в міні-пакетах і виконує RDD перетворення над тими міні-пакетами. Така схема дозволяє використовувати для потокової аналітики такий самий код що й для аналітики над пакетами даних, таким чином дозволяючи просту реалізацію лямбда-архітектури.[18][19] Проте, ця зручність оплачується латентністю яка дорівнює тривалості обробки міні-пакету. Існують інші рушії обробки потокових даних, які обробляють кожну подію окремо, а не в міні-пакетах, такі як Apache Storm[en] та потоковий компонент Apache Flink[en].[20] Spark Streaming має вбудовану можливість читання з Apache Kafka, Apache Flume[en], Twitter, ZeroMQ, Kinesis, та сокетів TCP/IP.[21]

Бібліотека машинного навчання MLlib ред.

Spark MLlib — це розподілений фреймворк для машинного навчання побудований на основі Spark Core. Великою мірою завдяки розподіленій архітектурі Spark яка активно використовує оперативну пам'ять, вона в 9 разів швидша за рішення на основі дисків, які використовуються в Apache Mahout[en] (згідно тестів продуктивності здійснених розробниками MLlib над задачею програмування Alternating Least Squares (ALS), і до того як Mahout отримав інтерфейс до Spark), і масштабується краще за Vowpal Wabbit[en].[22] Багато типових статистичних алгоритмів та алгоритмів машинного навчання реалізовані і постачаються разом з MLlib що спрощує побудову великих пайплайнів машинного навчання, наприклад:

GraphX ред.

GraphX це розподілений фреймворк обробки графів на основі Apache Spark. Через те що він побудований на основі незмінних RDD, графи теж незмінні, тому GraphX непридатний для роботи з графами що оновлюються, тим більше транзакціями, як у графових базах даних.[24] GraphX надає два окремі API для реалізації масово паралельних алгоритмів (таких як PageRank): Pregel-подібне, та більш загальне — MapReduce API.[25] На відміну від попередника, Bagel, підтримка якого формально завершилась з версії 1.6, GraphX має повну підтримку графів з атрибутами (графів в яких до вершин та ребер можуть приєднуватись атрибути).[26]

GraphX можна розглядати як Spark-альтернативу Apache Giraph[en], який використовує дисковий MapReduce Hadoop.[27]

Як і Apache Spark, GraphX спершу розпочався як дослідницький проєкт AMPLab Берклі та Databricks, і пізніше був переданий в Apache Software Foundation в проєкт Spark.[28]

Інфраструктура ред.

Сайт Spark Packages[29] станом на вересень 2017-го містить більш ніж 360 пакетів які розширюють функціональність Spark дозволяючи йому записувати та читати дані з різних джерел і форматів, містять реалізації різних алгоритмів машинного навчання та роботи з графами та інше.

Історія ред.

Проєкт Spark був початий Матеєм Захарією AMPLab університету Берклі в 2009, а його код відкритий в 2010 під ліцензією BSD.

У 2013, проєкт був подарований Apache Software Foundation і змінив свою ліцензію на Apache 2.0. У лютому 2014, Spark став проєктом верхнього рівня в Apache Software Foundation.[30]

В листопаді 2014, компанія Databricks заснована Матеєм, встановила за допомогою Spark новий світовий рекорд з сортування великих обсягів даних.[31]

Spark мав понад 1000 учасників проєкту в 2015,[32] що зробило його одним з найактивніших проєктів в Apache Software Foundation[30] і одним з найактивніших проєктів великих даних з відкритим кодом.

Зважаючи на популярність платформи, такі платні програми як General Assembly[en] та безкоштовні товариства, такі як The Data Incubator[en] почали пропонувати спеціалізовані навчальні курси[33]

Версія Дата першого релізу Остання мінорна версія Дата релізу
Old version, no longer supported: 0.5 2012-06-12 0.5.1 2012-10-07
Old version, no longer supported: 0.6 2012-10-14 0.6.2 2013-02-07
Old version, no longer supported: 0.7 2013-02-27 0.7.3 2013-07-16
Old version, no longer supported: 0.8 2013-09-25 0.8.1 2013-12-19
Old version, no longer supported: 0.9 2014-02-02 0.9.2 2014-07-23
Old version, no longer supported: 1.0 2014-05-26 1.0.2 2014-08-05
Old version, no longer supported: 1.1 2014-09-11 1.1.1 2014-11-26
Old version, no longer supported: 1.2 2014-12-18 1.2.2 2015-04-17
Old version, no longer supported: 1.3 2015-03-13 1.3.1 2015-04-17
Old version, no longer supported: 1.4 2015-06-11 1.4.1 2015-07-15
Old version, no longer supported: 1.5 2015-09-09 1.5.2 2015-11-09
Old version, no longer supported: 1.6 2016-01-04 1.6.3 2016-11-07
Old version, no longer supported: 2.0 2016-07-26 2.0.2 2016-11-14
Old version, no longer supported: 2.1 2016-12-28 2.1.3 2018-06-26
Old version, no longer supported: 2.2 2017-07-11 2.2.3 2019-01-11
Old version, no longer supported: 2.3 2018-02-28 2.3.4 2019-09-09
Older version, yet still supported: 2.4 LTS 2018-11-02 2.4.8 2021-05-17[34]
Current stable version: 3.0 2020-06-18 3.0.3 2021-06-01[35]
Current stable version: 3.1 2021-03-02 3.1.3 2022-02-18[36]
Current stable version: 3.2 2021-10-13 3.2.1 2022-01-26
Current stable version: 3.3 2022-06-16 3.3.0 2022-06-16
Легенда:
Стара версія
Стара версія, все ще підтримується
Остання версія
Остання бета-версія
Майбутній реліз

Виноски ред.

  1. The apache-spark Open Source Project on Open Hub: Languages Page — 2006.
  2. а б в г д е https://projects.apache.org/json/projects/spark.json
  3. Spark получил статус первичного проекта Apache [Архівовано 6 березня 2014 у Wayback Machine.] // opennet.ru 27.02.2014
  4. World record set for 100 TB sort by open source and public cloud team. Архів оригіналу за 29 червня 2015. Процитовано 28 січня 2015.
  5. 2015 Data Science Salary Survey. Архів оригіналу за 27 вересня 2015. Процитовано 8 жовтня 2015.
  6. а б в г д е Zaharia та Chambers, 2017.
  7. Spark Standalone Mode - Spark 2.2.0 Documentation. Архів оригіналу за 12 вересня 2017. Процитовано 11 вересня 2017.
  8. Cluster Mode Overview - Spark 1.2.0 Documentation - Cluster Manager Types. apache.org. Apache Foundation. 18 грудня 2014. Архів оригіналу за 19 січня 2015. Процитовано 18 січня 2015.
  9. Figure showing Spark in relation to other open-source Software projects including Hadoop. Архів оригіналу за 24 березня 2015. Процитовано 15 вересня 2017.
  10. MapR ecosystem support matrix. Архів оригіналу за 30 вересня 2017. Процитовано 15 вересня 2017.
  11. Doan, DuyHai (10 вересня 2014). Re: cassandra + spark / pyspark. Cassandra User (Список розсилки). Архів оригіналу за 30 травня 2015. Процитовано 21 листопада 2014.
  12. а б в г Zaharia, Matei; Chowdhury, Mosharaf; Franklin, Michael J.; Shenker, Scott; Stoica, Ion. Spark: Cluster Computing with Working Sets (PDF). USENIX Workshop on Hot Topics in Cloud Computing (HotCloud). Архів оригіналу (PDF) за 10 квітня 2016. Процитовано 15 вересня 2017.
  13. Zaharia, Matei; Chowdhury, Mosharaf; Das, Tathagata; Dave, Ankur; Ma,, Justin; McCauley, Murphy; J., Michael; Shenker, Scott; Stoica, Ion. Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing (PDF). USENIX Symp. Networked Systems Design and Implementation. Архів оригіналу (PDF) за 12 серпня 2017. Процитовано 15 вересня 2017.
  14. Xin, Reynold; Rosen, Josh; Zaharia, Matei; Franklin, Michael; Shenker, Scott; Stoica, Ion (June 2013). Shark: SQL and Rich Analytics at Scale (PDF). Архів оригіналу (PDF) за 9 серпня 2017. Процитовано 15 вересня 2017.
  15. Harris, Derrick (28 червня 2014). 4 reasons why Spark could jolt Hadoop into hyperdrive. Gigaom. Архів оригіналу за 24 жовтня 2017. Процитовано 15 вересня 2017.
  16. Архівована копія. Архів оригіналу за 11 червня 2018. Процитовано 25 вересня 2017.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)
  17. Архівована копія. Архів оригіналу за 8 жовтня 2017. Процитовано 7 жовтня 2017.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)
  18. Applying the Lambda Architecture with Spark, Kafka, and Cassandra | Pluralsight. www.pluralsight.com. Архів оригіналу за 9 жовтня 2017. Процитовано 20 листопада 2016.
  19. Shapira, Gwen (29 серпня 2014). Building Lambda Architecture with Spark Streaming. cloudera.com. Cloudera. Архів оригіналу за 14 червня 2016. Процитовано 17 червня 2016. re-use the same aggregates we wrote for our batch application on a real-time data stream
  20. Benchmarking Streaming Computation Engines: Storm, Flink and Spark Streaming. IEEE. May 2016. Архів оригіналу (PDF) за 5 березня 2020. Процитовано 9 жовтня 2017.
  21. Kharbanda, Arush (17 березня 2015). Getting Data into Spark Streaming. sigmoid.com. Sigmoid (Sunnyvale, California IT product company). Архів оригіналу за 15 серпня 2016. Процитовано 7 липня 2016.
  22. Sparks, Evan; Talwalkar, Ameet (6 серпня 2013). Spark Meetup: MLbase, Distributed Machine Learning with Spark. slideshare.net. Spark User Meetup, San Francisco, California. Архів оригіналу за 24 червня 2015. Процитовано 10 лютого 2014.
  23. MLlib | Apache Spark. spark.apache.org. Архів оригіналу за 19 жовтня 2017. Процитовано 18 січня 2016.
  24. Malak, Michael (14 червня 2016). Finding Graph Isomorphisms In GraphX And GraphFrames: Graph Processing vs. Graph Database. slideshare.net. sparksummit.org. Архів оригіналу за 17 серпня 2016. Процитовано 11 липня 2016.
  25. Malak, Michael (1 липня 2016). Spark GraphX in Action. Manning. с. 89. ISBN 9781617292521. Архів оригіналу за 21 березня 2022. Процитовано 9 жовтня 2017. Pregel and its little sibling aggregateMessages() are the cornerstones of graph processing in GraphX. ... algorithms that require more flexibility for the terminating condition have to be implemented using aggregateMessages()
  26. Malak, Michael (14 червня 2016). Finding Graph Isomorphisms In GraphX And GraphFrames: Graph Processing vs. Graph Database. slideshare.net. sparksummit.org. Архів оригіналу за 17 серпня 2016. Процитовано 11 липня 2016.
  27. Malak, Michael (1 липня 2016). Spark GraphX in Action. Manning. с. 9. ISBN 9781617292521. Архів оригіналу за 21 березня 2022. Процитовано 9 жовтня 2017. Giraph is limited to slow Hadoop Map/Reduce
  28. Gonzalez, Joseph; Xin, Reynold; Dave, Ankur; Crankshaw, Daniel; Franklin, Michael; Stoica, Ion (Oct 2014). GraphX: Graph Processing in a Distributed Dataflow Framework (PDF). Архів оригіналу (PDF) за 7 грудня 2014. Процитовано 9 жовтня 2017.
  29. Архівована копія. Архів оригіналу за 4 вересня 2017. Процитовано 11 вересня 2017.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)
  30. а б The Apache Software Foundation Announces Apache&#8482 Spark&#8482 as a Top-Level Project. apache.org. Apache Software Foundation. 27 лютого 2014. Архів оригіналу за 17 березня 2015. Процитовано 4 березня 2014.
  31. Spark officially sets a new record in large-scale sorting. Архів оригіналу за 15 травня 2015. Процитовано 14 вересня 2017.
  32. Open HUB Spark development activity. Архів оригіналу за 7 грудня 2014. Процитовано 14 вересня 2017.
  33. NY gets new bootcamp for data scientists: It’s free, but harder to get into than Harvard. Venture Beat. Архів оригіналу за 15 лютого 2016. Процитовано 21 лютого 2016.
  34. Spark News. apache.org. Архів оригіналу за 25 серпня 2021.
  35. Spark News. apache.org.
  36. Spark 3.1.3 released. spark.apache.org. Архів оригіналу за 18 червня 2022.

Література ред.

Посилання ред.