Какво е Apache Spark? Платформата за големи данни, която смаза Hadoop

Определен Apache Spark

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

От своето скромно начало в AMPLab в UC Berkeley през 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 Unified Analytics Platform, която е цялостна управлявана услуга, която предлага Apache Spark клъстери, поддръжка на поточно предаване, интегрирано уеб базирано разработване на преносими компютри и оптимизирана I / O производителност стандартно разпределение на 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 и много други. Голяма част от API Spark Core е изградена върху тази 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.

Избирането на някои колони от рамка с данни е толкова просто, колкото този ред:

citiesDF.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 се предлага с разпределени внедрявания на алгоритми за клъстериране и класификация, като к-означава клъстериране и случайни гори, които могат да се сменят лесно и лесно в рамките на потребителските тръбопроводи. Моделите могат да бъдат обучени от изследователи на данни в Apache Spark с помощта на R или Python, запазени с MLlib и след това внесени в базиран на Java или базиран на Scala тръбопровод за производствена употреба.

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

Spark GraphX

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

Искрено поточно предаване

Spark Streaming беше ранно допълнение към Apache Spark, което му помогна да придобие сцепление в среди, които изискват обработка в реално време или почти в реално време. Преди това обработката на партиди и потоци в света на Apache Hadoop бяха отделни неща. Бихте могли да напишете MapReduce код за вашите нужди за пакетна обработка и да използвате нещо като Apache Storm за вашите изисквания за поточно предаване в реално време. Това очевидно води до различни кодови бази, които трябва да се синхронизират за домейна на приложението, въпреки че се основават на напълно различни рамки, изискват различни ресурси и включват различни оперативни проблеми за тяхното стартиране.

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

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

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

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

Структурираното поточно предаване първоначално разчита на схемата за микробачинг на Spark Streaming за обработка на поточни данни. Но в Spark 2.3 екипът на Apache Spark добави режим на непрекъсната обработка с ниска латентност към структурираното поточно предаване, което му позволява да обработва отговори със закъснения до 1 ms, което е много впечатляващо. От Spark 2.4 непрекъснатата обработка все още се счита за експериментална. Докато структурираното поточно предаване е изградено върху двигателя на Spark SQL, непрекъснатото поточно предаване поддържа само ограничен набор от заявки.

Структурираното поточно предаване е бъдещето на стрийминг приложенията с платформата, така че ако създавате ново приложение за стрийминг, трябва да използвате структурирано поточно предаване. Старите API на Spark Streaming ще продължат да се поддържат, но проектът препоръчва прехвърляне към Structured Streaming, тъй като новият метод прави писането и поддържането на стрийминг код много по-поносимо.

Тръбопроводи за дълбоко обучение

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

Уроци за Apache Spark

Готови ли сте да се потопите и да научите Apache Spark? Горещо препоръчваме „Неандерталско ръководство на Evan Heitman за Apache Spark“ в Python, което не само излага основите на това как работи Apache Spark с относително прости термини, но и ви води през процеса на писане на просто приложение на Python, което използва рамката . Статията е написана от гледна точка на учен за данни, което има смисъл, тъй като науката за данни е свят, в който големите данни и машинното обучение стават все по-критични.

Ако търсите някои примери за Apache Spark, за да ви даде представа какво може да направи платформата и как го прави, разгледайте Spark By {Примери}. Тук има много примерен код за редица основни задачи, които изграждат градивните елементи на програмирането на Spark, така че можете да видите компонентите, които съставляват по-големите задачи, за които е създадена Apache Spark.

Трябва да отидете по-дълбоко? DZone има това, което той скромно нарича „пълната колекция Apache Spark“, която се състои от множество полезни уроци по много теми за Apache Spark. Приятно учене!