You are on page 1of 24

Spark

Apache Spark-це кластерна обчислювальна платформа для масштабної


обробки даних. Spark не використовує MapReduce як механізм
виконання; натомість вона використовує власний розподілену
програму для виконання роботи над кластером.
Spark тісно інтегрована з Hadoop: вона може працювати на YARN і з
форматами файлів Hadoop, і сховищами, такими як HDFS.
Spark
Spark найбільш відомий своєю здатністю зберігати великі робочі
набори даних у пам’яті між завданнями. Ця можливість дозволяє Spark
перевершити аналогічний робочий процес MapReduce, де набори
даних завжди завантажуються з диска. Найбільші переваги від
використання моделі обробки Spark мають ітераційні алгоритми (де
функція застосовується до набору даних неодноразово до виконання
умови виходу) та інтерактивний аналіз (коли користувач надсилає
серію спеціальних дослідницьких запитів до набору даних) .
Spark
Як і MapReduce, Spark має концепцію завдання (job). Завдання Spark є
більш загальним, ніж завдання MapReduce, однак, воно складається з
довільного орієнтованого ациклічного графа (DAG), тобто з етапів,
кожен з яких приблизно відповідає фазі map або reduce в MapReduce.
Етапи поділяються на задачі за допомогою середовища виконання
Spark і запускаються паралельно на розділах стійких розподілених
наборів даних (Resilient Distributed Datasets, RDD), розподілених на
кластері - так само, як завдання в MapReduce. Завдання завжди
виконується в контексті програми, яка служить для групування RDD та
спільних змінних. Додаток може виконувати декілька завдань,
послідовно або паралельно, і забезпечує механізм доступу завдання
до RDD, кешованого попереднім завданням у тій самій програмі.
Spark
Spark досягає простоти, забезпечуючи фундаментальну абстракцію
простої логічної структури даних, яка називається стійким
розподіленим набором даних (RDD), на основі якого будуються всі інші
структуровані абстракції вищого рівня, такі як DataFrames та Datasets.
Надаючи набір перетворень і дій як операцій, Spark пропонує просту
модель програмування, яку можна використовувати для створення
додатків великих даних розповсюдженими мовами.
Spark
Spark
На високому рівні в архітектурі Spark додаток Spark складається з
програми-драйвера, яка відповідає за організацію паралельних
операцій у кластері Spark. Драйвер звертається до розподілених
компонентів кластера - виконавців Spark та менеджера кластера -
через SparkSession.
Як частина програми Spark, відповідальна за створення екземпляра
SparkSession, драйвер Spark має кілька ролей: він спілкується з
менеджером кластера; він запитує ресурси (процесор, пам’ять тощо) у
менеджера кластера для виконавців Spark (JVM); і він перетворює всі
операції Spark у обчислення орієнтованих ациклічних графів, планує їх і
розподіляє їх виконання як задачі між виконавцями Spark. Після
розподілу ресурсів він безпосередньо спілкується з виконавцями.
Spark
За допомогою SparkSession можна створювати параметри середовища
виконання JVM, визначати DataFrames та Datasets, читати з джерел
даних, отримувати доступ до метаданих каталогу та видавати запити
Spark SQL. SparkSession забезпечує єдину уніфіковану точку входу до
всіх функцій Spark.
Менеджер кластера відповідає за управління та розподіл ресурсів для
кластера вузлів, на яких працює програма Spark. Наразі Spark
підтримує чотири кластерних менеджера: вбудований автономний
кластерний менеджер, Apache Hadoop YARN, Apache Mesos та
Kubernetes.
Spark
Виконавець Spark працює на кожному робочому вузлі кластера.
Виконавці спілкуються з програмою-драйвером і несуть
відповідальність за виконання задач для працівників. У більшості
режимів розгортання на одному вузлі працює лише один виконавець.
Spark
Фактичні фізичні дані розподіляються по сховищах у вигляді розділів,
що знаходяться або в HDFS, або в хмарному сховищі. Хоча дані
розподіляються у вигляді розділів у фізичному кластері, Spark
розглядає кожен розділ як логічну абстракцію високого рівня - як
DataFrame у пам’яті. Хоча це не завжди можливо, кожному виконавцю
Spark бажано призначити задачу, що працює з найближчим до цього
виконавця розділом у мережі.
Spark
Spark
Операції Spark з розподіленими даними можна класифікувати на два
типи: перетворення та дії. Перетворення, як випливає з назви,
перетворюють Spark DataFrame у новий DataFrame, не змінюючи
вихідних даних.
Усі перетворення виконуються «ліниво». Тобто їх результати не
обчислюються одразу, але вони записуються або запам'ятовуються як
лінія. Записана лінія дозволяє Spark пізніше у своєму плані виконання
змінити певні перетворення, об’єднати їх або оптимізувати
перетворення на етапи для більш ефективного виконання. «Ледаче»
виконання - це стратегія Spark, що затримує виконання поки не буде
викликано дію або проведено операції з даними (читання або запис).
Spark
Оскільки Spark записує кожне перетворення у своїй лінії, а DataFrames є
незмінними між перетвореннями, то ж він може відтворювати свій
вихідний стан, просто відтворюючи записану лінію. Це забезпечує
відмовостійкість.
Перетворення: orderBy(), groupBy(), filter(), select(), join()
Дії: show(), take(), count(), collect(), save()
Spark
Перетворення можна класифікувати як такі, що мають або вузькі або
широкі залежності. Будь-яке перетворення, де один вихідний розділ
можна обчислити з одного вхідного розділу, є вузьким перетворенням.
Spark
Стійкі розподілені набори даних (RDD) - це найпростіша абстракція в
Spark. Існують три основні характеристики, пов'язані з RDD:
• Залежності
• Розділи
• Обчислювальна функція: Розділ => Iterator[T]
Опціональні характеристики:
• Partitioner для RDD з парами ключ-значення
• Список бажаних розміщень для обчислення кожного розділення
(наприклад, розташування блоків для файлу розподіленої файлової
системи Hadoop [HDFS])
Spark
По-перше, потрібен список залежностей, який вказує Spark, як
будується RDD з його входами. За необхідності для відтворення
результатів Spark може відтворити RDD з цих залежностей і повторити
операції над ним. Ця характеристика надає RDD стійкість. По-друге,
розділи надають Spark можливість розділити роботу, щоб
паралелізувати обчислення на розділах між виконавцями. У деяких
випадках – наприклад при читанні з HDFS - Spark використовуватиме
інформацію про розміщення, щоб надсилати роботу виконавцям,
близьким до даних. Таким чином по мережі передається менше даних.
І, нарешті, RDD має обчислювальну функцію, яка створює Iterator [T]
для даних, які будуть зберігатися в RDD.
Spark
Spark має два типи розподілених спільних змінних: широкомовні змінні
та акумулятори.
Широкомовні змінні - це спільні незмінні змінні, які кешуються на
кожній машині в кластері замість серіалізації з кожною окремою
задачею. Найбільш розповсюджений випадок їх використання -
передача великої таблиці пошуку, яка поміщається у пам’яті
виконавців.
Акумулятори - це спосіб оновлення значення всередині різноманітних
перетворень та розповсюдження цього значення на вузол драйвера
ефективним та надійним способом.
Spark
Spark DataFrames схожі на розподілені таблиці в пам’яті з іменованими
стовпцями та схемами, де кожен стовпець має певний тип даних: ціле
число, рядок, масив, map, дійсне число, дата, позначка часу тощо.
Схема в Spark визначає імена стовпців та відповідні типи даних для
DataFrames. Найчастіше схеми вступають у дію при читанні
структурованих даних із зовнішнього джерела даних. Визначення
схеми заздалегідь надає наступні переваги:
• Spark не потрібно самостійно визначати типи даних.
• Spark не потрібно створювати окреме завдання лише для того, щоб
прочитати значну частину великого файлу для з'ясування схеми
• Можливість завчасно виявити помилки, якщо дані не відповідають
схемі.
Spark
Spark дозволяє визначити схему двома способами. Перший - це
визначити її програмно, а інший - використати рядок DDL (Data
Definition Language), який набагато простіший і легший для читання.
from pyspark.sql.types import *

schema = StructType([StructField("Name", StringType(), False),

StructField("Job", StringType(), False),

StructField("Payment", FloatType (), False)])

schema = " Name STRING, Job STRING, Payment FLOAT"


Spark
Іменовані стовпці в DataFrames концептуально подібні до іменованих
стовпців у Pandas або R DataFrames або до таблиці СУБД: вони
описують тип поля. Можна перерахувати всі стовпці за їх іменами, а
також можна виконувати операції над їх значеннями за допомогою
реляційних або обчислювальних виразів. У підтримуваних мовах Spark
стовпці - це об’єкти з відкритими методами (представлені типом
Column).
Рядок у Spark - це загальний об’єкт Row, що містить один або кілька
стовпців. Кожен стовпець може мати один і той же тип даних
(наприклад, ціле число або рядок), або вони можуть мати різні типи
(ціле число, рядок, масив тощо). Оскільки Row - це об’єкт у Spark і
впорядкована колекція полів, можна створити екземпляр Row у кожній
із підтримуваних мов Spark та отримати доступ до його полів за
індексом, що починається з 0.
Spark
Щоб виконувати загальні операції з даними над DataFrames, спочатку
потрібно завантажити фрейм даних із джерела даних. Spark надає
інтерфейс DataFrameReader, який дозволяє читати дані у DataFrame з
незліченних джерел даних у таких форматах, як JSON, CSV, Parquet,
Text, Avro, ORC тощо. Аналогічно, щоб записати DataFrame назад до
джерела даних у певному форматі, Spark використовує
DataFrameWriter.
Spark
Проекція в реляційній мові - це спосіб повернути лише рядки, що
відповідають певній реляційній умові, за допомогою фільтрів. У Spark
проекції виконуються за допомогою методу select (), тоді як фільтри
можна виразити за допомогою методу filter () або where ().
Для фільтрації рядків створюється вираз, який має значення true або
false. Потім рядки відфільтровуються з виразом, що дорівнює false.
Найпоширеніший спосіб зробити це за допомогою DataFrames -
створити вираз як String або створити вираз за допомогою набору
маніпуляцій зі стовпцями. Існує два способи виконання цієї операції: з
використанням where або filter, обидва вони будуть виконувати одну і
ту ж операцію та приймати однакові типи аргументів при використанні
з рамками даних.
Spark
Дуже поширеним варіантом використання є вилучення унікальних або
окремих значень у DataFrame. Ці значення можуть бути в одному або
кількох стовпцях. Це можна зробити за допомогою методу distinct в
DataFrame, який дозволяє видалити дублікати будь-яких рядків, які є в
цьому DataFrame.
Іноді може знадобитися просто вибрати випадкові записи з DataFrame.
Це можна зробити за допомогою методу sample з DataFrame, який дає
змогу вказати частку рядків для вилучення з DataFrame та чи зробити
вибірку з заміною чи без.
Випадкові розбивки можуть бути корисними, коли потрібно розбити
DataFrame на випадкові "розщеплення" вихідного DataFrame. Це часто
використовується з алгоритмами машинного навчання для створення
навчальних, перевірочних та тестових наборів.
Spark
Можна вибірково перейменувати стовпці за допомогою методу
withColumnRenamed ().
Кілька перетворень і дій у DataFrames, таких як groupBy (), orderBy () і
count (), пропонують можливість агрегування за іменами стовпців, а
потім - зведення даних у них.
API DataFrame надає описові статистичні методи, такі як min (), max (),
sum () та avg ().
Spark
Dataset це строго типізована колекція об'єктів, специфічних для області
задачі, які можна трансформувати паралельно за допомогою
функціональних або реляційних операцій.
У підтримуваних мовах Spark Dataset мають сенс лише в Java та Scala,
тоді як у Python і R мають значення лише DataFrames. Це тому, що у
Python і R типи динамічно визначаються або призначаються під час
виконання, а не під час компіляції. У Scala та Java навпаки: типи
прив’язані до змінних та об’єктів під час компіляції. У Scala, однак,
DataFrame - це просто псевдонім для нетипізованого Dataset[Row].

You might also like