За първи път чух за Spark в края на 2013 г., когато се заинтересувах от Scala, езикът, на който е написана Spark. Известно време по-късно направих забавен проект за наука за данни, опитвайки се предскажете оцеляването на Титаник . Това се оказа чудесен начин да се запознаете допълнително с концепциите и програмирането на Spark. Горещо го препоръчвам за всеки амбициозен Разработчици на Spark търси място за започване.
Днес Spark се приема от големи играчи като Amazon, eBay и Yahoo! Много организации изпълняват Spark на клъстери с хиляди възли. Според Spark FAQ най-големият известен клъстер има над 8000 възла. Всъщност Spark е технология, която си струва да се вземе под внимание и да се научи.
Тази статия предоставя въведение в Spark, включително случаи на употреба и примери. Той съдържа информация от уебсайта Apache Spark, както и книгата Learning Spark - светкавично бърз анализ на големи данни .
Искра е проект на Apache, рекламиран като „светкавично бързи клъстерни изчисления“. Той има процъфтяваща общност с отворен код и е най-активният проект на Apache в момента.
Spark осигурява по-бърза и по-обща платформа за обработка на данни. Spark ви позволява да стартирате програми до 100 пъти по-бързо в паметта или 10 пъти по-бързо на диск, отколкото Hadoop. Миналата година Spark пое Hadoop, като завърши състезанието за 100 TB Daytona GraySort 3 пъти по-бързо на една десета от броя на машините и също стана най-бързият двигател с отворен код за сортиране на петабайт .
Spark също така дава възможност за по-бързо писане на код, тъй като имате на разположение над 80 оператори на високо ниво. За да демонстрираме това, нека да разгледаме „Здравей, свят!“ на BigData: пример за броя на думите. Написан на Java за MapReduce, той има около 50 реда код, докато в Spark (и Scala) можете да го направите просто като това:
sparkContext.textFile('hdfs://...') .flatMap(line => line.split(' ')) .map(word => (word, 1)).reduceByKey(_ + _) .saveAsTextFile('hdfs://...')
Друг важен аспект, когато се научавате да използвате Apache Spark, е интерактивната обвивка (REPL), която тя предлага извън кутията. Използвайки REPL, човек може да тества резултата от всеки ред код, без да е необходимо първо да кодира и изпълни цялата задача. По този начин пътят към работния код е много по-кратък и е възможен ad-hoc анализ на данните.
Допълнителните ключови характеристики на Spark включват:
Ядрото Spark се допълва от набор от мощни библиотеки от по-високо ниво, които могат да се използват безпроблемно в едно и също приложение. Понастоящем тези библиотеки включват SparkSQL, Spark Streaming, MLlib (за машинно обучение) и GraphX, всяка от които е подробно описана в тази статия. В момента се разработват и допълнителни Spark библиотеки и разширения.
Искрено ядро е основният механизъм за мащабна паралелна и разпределена обработка на данни. Той отговаря за:
Spark въвежда концепцията за RDD (Устойчив разпределен набор от данни) , неизменна, устойчива на грешки, разпределена колекция от обекти, които могат да се експлоатират паралелно. RDD може да съдържа всякакъв тип обект и се създава чрез зареждане на външен набор от данни или разпространение на колекция от програмата за драйвери.
RDD поддържат два вида операции:
Трансформациите в Spark са „мързеливи“, което означава, че те не изчисляват резултатите си веднага. Вместо това те просто „запомнят“ операцията, която трябва да се извърши, и набора от данни (напр. Файл), към който трябва да се извърши операцията. Трансформациите в действителност се изчисляват само когато се извика действие и резултатът се върне в програмата за драйвери. Този дизайн позволява на Spark да работи по-ефективно. Например, ако голям файл се трансформира по различни начини и се предаде на първо действие, Spark ще обработва и връща резултата само за първия ред, вместо да върши работата за целия файл.
По подразбиране всеки трансформиран RDD може да бъде преизчислен всеки път, когато изпълните действие върху него. Можете обаче да запазите RDD в паметта, използвайки метода persist или cache, като в този случай Spark ще запази елементите около клъстера за много по-бърз достъп при следващото му заявяване.
SparkSQL е компонент Spark, който поддържа заявки за данни или чрез SQL, или чрез Език на заявки за кошери . Той възниква като порт Apache Hive, който се изпълнява върху Spark (вместо MapReduce) и сега е интегриран със стека Spark. В допълнение към предоставянето на поддръжка за различни източници на данни, това дава възможност да се преплитат SQL заявки с трансформации на код, което води до много мощен инструмент. По-долу е даден пример за съвместима заявка с Hive:
// sc is an existing SparkContext. val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) sqlContext.sql('CREATE TABLE IF NOT EXISTS src (key INT, value STRING)') sqlContext.sql('LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src') // Queries are expressed in HiveQL sqlContext.sql('FROM src SELECT key, value').collect().foreach(println)
Искрено поточно предаване поддържа обработка на данни в реално време за поточно предаване на данни, като производствени регистрационни файлове на уеб сървър (напр. Apache Flume и HDFS / S3), социални медии като Twitter и различни опашки за съобщения като Kafka. Под капака Spark Streaming получава входните потоци от данни и ги разделя на партиди. След това те се обработват от двигателя Spark и генерират окончателен поток от резултати в партиди, както е показано по-долу.
API на Spark Streaming съвпада с този на Spark Core, което улеснява програмистите да работят в света както на пакетни, така и на поточни данни.
MLlib е библиотека за машинно обучение, която предоставя различни алгоритми, предназначени за мащабиране на клъстер за класификация, регресия, групиране, съвместно филтриране и т.н. (вижте статията на ApeeScape за машинно обучение за повече информация по тази тема). Някои от тези алгоритми също работят с поточни данни, като линейна регресия, използвайки обикновени най-малки квадрати или k-означава групиране (и още по пътя). Apache Mahout (библиотека за машинно обучение за Hadoop) вече се отвърна от MapReduce и обедини сили в Spark MLlib.
GraphX е библиотека за манипулиране на графики и извършване на графично-паралелни операции. Той осигурява унифициран инструмент за ETL, изследователски анализ и итеративни изчисления на графики. Освен вградени операции за манипулиране с графики, той предоставя библиотека от често срещани алгоритми на графики като PageRank.
След като отговорихме на въпроса „Какво е Apache Spark?“, Нека помислим за какви проблеми или предизвикателства би могло да се използва най-ефективно.
Наскоро попаднах на статия за експеримент с открийте земетресение, като анализирате поток в Twitter . Интересното е, че беше показано, че тази техника вероятно ще ви информира за земетресение в Япония по-бързо от Японската метеорологична агенция. Въпреки че са използвали различни технологии в статията си, мисля, че е чудесен пример да видим как бихме могли да използваме Spark с опростени кодови фрагменти и без кода на лепилото.
Първо, ще трябва да филтрираме туитове, които изглеждат подходящи като „земетресение“ или „разтърсване“. Лесно бихме могли да използваме Spark Streaming за тази цел, както следва:
TwitterUtils.createStream(...) .filter(_.getText.contains('earthquake') || _.getText.contains('shaking'))
След това ще трябва да извършим семантичен анализ на туитовете, за да определим дали изглежда, че те се отнасят към текущо земетресение. Туитове като „Земетресение!“ или „Сега се разклаща“, например, би се считало за положителни мачове, докато туитовете като „Присъствие на конференция за земетресение“ или „Земетресението вчера беше страшно“ не биха. За тази цел авторите на статията са използвали машина за подпомагане на вектори (SVM). Ще направим същото и тук, но можем да опитаме и с стрийминг версия . Полученият пример за код от MLlib ще изглежда по следния начин:
// We would prepare some earthquake tweet data and load it in LIBSVM format. val data = MLUtils.loadLibSVMFile(sc, 'sample_earthquate_tweets.txt') // Split data into training (60%) and test (40%). val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L) val training = splits(0).cache() val test = splits(1) // Run training algorithm to build the model val numIterations = 100 val model = SVMWithSGD.train(training, numIterations) // Clear the default threshold. model.clearThreshold() // Compute raw scores on the test set. val scoreAndLabels = test.map { point => val score = model.predict(point.features) (score, point.label) } // Get evaluation metrics. val metrics = new BinaryClassificationMetrics(scoreAndLabels) val auROC = metrics.areaUnderROC() println('Area under ROC = ' + auROC)
Ако сме доволни от степента на прогнозиране на модела, бихме могли да преминем към следващия етап и да реагираме, когато открием земетресение. За да открием такъв, се нуждаем от определен брой (т.е. плътност) положителни туитове в определен времеви прозорец (както е описано в статията). Имайте предвид, че за туитове с активирани услуги за местоположение в Twitter бихме извлекли и местоположението на земетресението. Въоръжени с тези знания, бихме могли да използваме SparkSQL и да заявим съществуваща таблица на Hive (съхраняваща потребители, заинтересовани да получават известия за земетресение), за да извлечем техните имейл адреси и да им изпратим персонализиран предупредителен имейл, както следва:
// sc is an existing SparkContext. val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) // sendEmail is a custom function sqlContext.sql('FROM earthquake_warning_users SELECT firstName, lastName, city, email') .collect().foreach(sendEmail)
Потенциалните случаи на използване на Spark се простират далеч отвъд откриването на земетресения, разбира се.
Ето една бърза (но със сигурност далеч изчерпателна!) Извадка от други случаи на употреба, които изискват справяне със скоростта, разнообразието и обема на Големите данни, за които Spark е толкова подходящ:
В игровата индустрия обработката и откриването на модели от потенциалния огън на събитията в реално време в играта и възможността да се реагира на тях незабавно е способност, която може да даде доходоносен бизнес, за цели като задържане на играчи, целенасочена реклама, автоматично -настройка на нивото на сложност и т.н.
В индустрията за електронна търговия информацията за транзакциите в реално време може да бъде предадена на алгоритъм за стрийминг клъстериране k-означава или съвместно филтриране като КОГА . Тогава резултатите могат дори да се комбинират с други неструктурирани източници на данни, като коментари на клиенти или прегледи на продукти, и да се използват за постоянно подобряване и адаптиране на препоръките с течение на времето с нови тенденции.
Във финансовата или защитната индустрия стекът Spark може да се приложи към система за откриване на измами или проникване или базирано на риска удостоверяване. Той може да постигне първокласни резултати, като събира огромни количества архивирани дневници, комбинирайки ги с външни източници на данни като информация за пробиви в данни и компрометирани акаунти (вижте например https://haveibeenpwned.com/ ) и информация от връзката / заявката като IP геолокация или време.
В обобщение, Spark помага да се опрости предизвикателната и изчислителна интензивна задача за обработка на големи обеми от данни в реално време или архивирани данни, както структурирани, така и неструктурирани, безпроблемно интегриращи съответните сложни възможности като машинно обучение и графични алгоритми. Spark носи обработка на големи данни за масите. Виж това!
Spark е проект на Apache, рекламиран като „светкавично бързи клъстерни изчисления“. Той има процъфтяваща общност с отворен код и е най-активният проект на Apache в момента.
Apache Spark е написан на Scala.
Spark помага да се опрости предизвикателната и изчислително интензивна задача за обработка на големи обеми от данни в реално време или архивирани данни.