Introducere în Apache Spark cu exemple și cazuri de Utilizare
am auzit prima dată de Spark la sfârșitul anului 2013, când am devenit interesat de Scala, limba în care este scris Spark. Ceva timp mai târziu, am făcut un proiect distractiv de știință a datelor încercând să prezic supraviețuirea pe Titanic. Acest lucru s-a dovedit a fi o modalitate excelentă de a fi introdus în continuare pentru a declanșa concepte și programare. Am foarte recomanda pentru orice dezvoltatori care aspiră Spark în căutarea unui loc pentru a începe.
astăzi, Spark este adoptat de jucători importanți precum Amazon, eBay și Yahoo! Multe organizații rulează Spark pe clustere cu mii de noduri. Conform FAQ Spark, cel mai mare cluster cunoscut are peste 8000 de noduri. Într-adevăr, Spark este o tehnologie bine în valoare de a lua notă de și de învățare despre.
Acest articol oferă o introducere la Spark, inclusiv cazuri de utilizare și exemple. Acesta conține informații de pe site – ul Apache Spark, precum și cartea Learning Spark-Lightning-fast Big Data Analysis.
ce este Apache Spark? O introducere
Spark este un proiect Apache promovat ca”lightning fast cluster computing”. Are o comunitate open-source înfloritoare și este cel mai activ proiect Apache în acest moment.Spark oferă o platformă de procesare a datelor mai rapidă și mai generală. Spark vă permite să rulați programe de până la 100x mai rapid în memorie, sau 10x mai rapid pe disc, decât Hadoop. Anul trecut, Spark a preluat Hadoop prin finalizarea concursului Daytona GraySort de 100 TB de 3 ori mai rapid pe o zecime din numărul de mașini și a devenit, de asemenea, cel mai rapid motor open source pentru sortarea unui petabyte.
Spark face, de asemenea, posibilă scrierea mai rapidă a codului, deoarece aveți la dispoziție peste 80 de operatori de nivel înalt. Pentru a demonstra acest lucru, să aruncăm o privire la „Hello World!”din BigData: exemplul numărului de cuvinte. Scris în Java pentru MapReduce are în jur de 50 de linii de cod, în timp ce în Spark (și Scala) o puteți face la fel de simplu ca aceasta:
sparkContext.textFile("hdfs://...") .flatMap(line => line.split(" ")) .map(word => (word, 1)).reduceByKey(_ + _) .saveAsTextFile("hdfs://...")
Un alt aspect important atunci când învățați cum să utilizați Apache Spark este shell-ul interactiv (REPL) pe care îl oferă în afara casetei. Folosind REPL, se poate testa rezultatul fiecărei linii de cod fără a fi nevoie mai întâi să codificați și să executați întreaga lucrare. Calea către Codul De lucru este astfel mult mai scurtă și este posibilă analiza datelor ad-hoc.
caracteristicile cheie suplimentare ale Spark includ:
- oferă în prezent API-uri în Scala, Java și Python, cu suport pentru alte limbi (cum ar fi R) pe drum
- se integrează bine cu ecosistemul Hadoop și sursele de date (HDFS, Amazon S3, Hive, HBase, Cassandra etc.)
- poate rula pe clustere gestionate de Hadoop fire sau Apache Mesos și poate rula, de asemenea, independent
miezul Spark este completat de un set de biblioteci puternice, de nivel superior, care pot fi utilizate fără probleme în aceeași aplicație. Aceste biblioteci includ în prezent SparkSQL, Spark Streaming, MLlib (pentru învățarea automată) și GraphX, fiecare dintre acestea fiind detaliat în acest articol. Bibliotecile și extensiile Spark suplimentare sunt în prezent în curs de dezvoltare.
Spark Core
Spark Core este motorul de bază pentru prelucrarea datelor paralele și distribuite pe scară largă. Acesta este responsabil pentru:
- gestionarea memoriei și recuperarea erorilor
- programarea, distribuirea și monitorizarea lucrărilor pe un cluster
- interacțiunea cu sistemele de stocare
Spark introduce conceptul de RDD (Resilient Distributed Dataset), o colecție imuabilă de obiecte care pot fi operate în paralel. Un RDD poate conține orice tip de obiect și este creat prin încărcarea unui set de date extern sau distribuirea unei colecții din programul driverului.
RDD-urile suportă două tipuri de operațiuni:
- transformările sunt operații (cum ar fi map, filter, join, union și așa mai departe) care sunt efectuate pe un RDD și care produc un nou RDD care conține rezultatul.
- acțiunile sunt operații (cum ar fi reducerea, numărarea, prima și așa mai departe) care returnează o valoare după rularea unui calcul pe un RDD.
transformările în Spark sunt „leneșe”, ceea ce înseamnă că nu își calculează rezultatele imediat. În schimb, ei doar „amintesc” operația care trebuie efectuată și setul de date (de exemplu, fișierul) la care urmează să fie efectuată operația. Transformările sunt calculate efectiv numai atunci când o acțiune este apelată și rezultatul este returnat programului driver. Acest design permite Spark să funcționeze mai eficient. De exemplu, dacă un fișier mare a fost transformat în diferite moduri și a trecut la prima acțiune, Spark ar procesa și returna rezultatul doar pentru prima linie, mai degrabă decât să lucreze pentru întregul fișier.
în mod implicit, fiecare RDD transformat poate fi recalculat de fiecare dată când executați o acțiune pe ea. Cu toate acestea, puteți persista și un RDD în memorie utilizând metoda persist sau cache, caz în care Spark va păstra elementele în jurul clusterului pentru un acces mult mai rapid data viitoare când îl interogați.
SparkSQL
SparkSQL este o componentă Spark care acceptă interogarea datelor fie prin SQL, fie prin limbajul de interogare Hive. A apărut ca portul Apache Hive pentru a rula deasupra Spark (în locul MapReduce) și este acum integrat cu stiva Spark. În plus față de furnizarea de suport pentru diverse surse de date, face posibilă țeserea interogărilor SQL cu transformări de cod, ceea ce duce la un instrument foarte puternic. Mai jos este un exemplu de interogare compatibilă cu 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 HiveQLsqlContext.sql("FROM src SELECT key, value").collect().foreach(println)
Spark Streaming
Spark Streaming acceptă procesarea în timp real a datelor de streaming, cum ar fi fișierele jurnal ale serverului web de producție (de exemplu, Apache Flume și HDFS/S3), social media precum Twitter și diverse cozi de mesagerie precum Kafka. Sub capotă, streamingul Spark primește fluxurile de date de intrare și împarte datele în loturi. Apoi, acestea sunt procesate de motorul Spark și generează fluxul final de rezultate în loturi, așa cum este descris mai jos.
API-ul Spark Streaming se potrivește îndeaproape cu cel al nucleului Spark, facilitând programatorilor să lucreze atât în lumea datelor lot, cât și în streaming.
MLlib
MLlib este o bibliotecă de învățare automată care oferă diverși algoritmi concepuți pentru a scala pe un cluster pentru clasificare, regresie, grupare, filtrare colaborativă și așa mai departe (consultați articolul lui Toptal despre învățarea automată pentru mai multe informații despre acest subiect). Unii dintre acești algoritmi funcționează și cu date de streaming, cum ar fi regresia liniară folosind cele mai mici pătrate obișnuite sau K-înseamnă clustering (și multe altele pe drum). Apache Mahout (o bibliotecă de învățare automată pentru Hadoop) s-a îndepărtat deja de MapReduce și și-a unit forțele pe Spark MLlib.
GraphX
GraphX este o bibliotecă pentru manipularea graficelor și efectuarea operațiilor grafice paralele. Acesta oferă un instrument uniform pentru ETL, analiza exploratorie și calcule grafice iterative. În afară de operațiunile încorporate pentru manipularea graficului, acesta oferă o bibliotecă de algoritmi grafici comuni, cum ar fi PageRank.
cum se utilizează Apache Spark: cazul de utilizare a detectării evenimentelor
acum că am răspuns la întrebarea „Ce este Apache Spark?”, să ne gândim la ce fel de probleme sau provocări ar putea fi utilizate cel mai eficient.
am dat peste un articol recent despre un experiment pentru a detecta un cutremur prin analizarea unui flux Twitter. Interesant, sa demonstrat că această tehnică a fost probabil să vă informeze despre un cutremur în Japonia mai repede decât Agenția Meteorologică din Japonia. Chiar dacă au folosit tehnologii diferite în articolul lor, cred că este un exemplu excelent pentru a vedea cum am putea folosi Spark cu fragmente de cod simplificate și fără codul de lipici.
În primul rând, ar trebui să filtrăm tweet-urile care par relevante, cum ar fi „cutremur” sau „agitare”. Am putea folosi cu ușurință streamingul Spark în acest scop, după cum urmează:
TwitterUtils.createStream(...) .filter(_.getText.contains("earthquake") || _.getText.contains("shaking"))
apoi, ar trebui să rulăm o analiză semantică pe tweets pentru a determina dacă par să se refere la un eveniment actual de cutremur. Tweets ca ” cutremur!”sau” acum se agită”, de exemplu, ar fi luați în considerare meciurile pozitive, în timp ce tweet-urile precum” participarea la o conferință de cutremur „sau” cutremurul de ieri a fost înfricoșător ” nu ar fi. Autorii lucrării au folosit o mașină vector suport (SVM) în acest scop. Vom face același lucru aici, dar putem încerca și o versiune de streaming. Un exemplu de cod rezultat din MLlib ar arăta astfel:
// 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 modelval numIterations = 100val 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)
dacă suntem mulțumiți de rata de predicție a modelului, am putea trece la următoarea etapă și să reacționăm ori de câte ori descoperim un cutremur. Pentru a detecta unul, avem nevoie de un anumit număr (adică densitate) de tweet-uri pozitive într-o fereastră de timp definită (așa cum este descris în articol). Rețineți că, pentru tweet-urile cu servicii de localizare Twitter activate, vom extrage și locația cutremurului. Înarmați cu aceste cunoștințe, am putea folosi SparkSQL și interoga un tabel stup existent (stocarea utilizatorilor interesați să primească notificări cutremur) pentru a prelua adresele lor de e-mail și a le trimite un e-mail de avertizare personalizat, după cum urmează:
// sc is an existing SparkContext.val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)// sendEmail is a custom functionsqlContext.sql("FROM earthquake_warning_users SELECT firstName, lastName, city, email") .collect().foreach(sendEmail)
alte cazuri de Utilizare Apache Spark
cazurile potențiale de utilizare pentru Spark se extind mult dincolo de detectarea cutremurelor, desigur.
Iată o scurtă (dar cu siguranță nici pe departe exhaustivă!) eșantionarea altor cazuri de utilizare care necesită tratarea vitezei, varietății și volumului de date mari, pentru care Spark este atât de potrivit:
în industria jocurilor, procesarea și descoperirea tiparelor din potențialele firehose ale evenimentelor din joc în timp real și posibilitatea de a răspunde imediat la acestea este o capacitate care ar putea produce o afacere profitabilă, în scopuri precum reținerea jucătorilor, publicitatea direcționată, reglarea automată a nivelului de complexitate și așa mai departe.
în industria comerțului electronic, informațiile despre tranzacții în timp real ar putea fi transmise unui algoritm de clustering în flux, cum ar fi k-means sau filtrarea colaborativă, cum ar fi ALS. Rezultatele ar putea fi apoi combinate cu alte surse de date nestructurate, cum ar fi Comentariile clienților sau recenziile produselor, și utilizate pentru a îmbunătăți și adapta constant recomandările în timp cu noile tendințe.
în industria financiară sau de securitate, stiva Spark ar putea fi aplicată unui sistem de detectare a fraudei sau a intruziunilor sau autentificării bazate pe riscuri. Ar putea obține rezultate de top prin recoltarea unor cantități uriașe de jurnale arhivate, combinând-o cu surse de date externe, cum ar fi informații despre încălcări ale datelor și conturi compromise (a se vedea, de exemplu, https://haveibeenpwned.com/) și informații din conexiune/solicitare, cum ar fi geolocalizarea IP sau ora.
concluzie
pentru a rezuma, Spark ajută la simplificarea sarcinii dificile și intensive din punct de vedere computațional de procesare a volumelor mari de date în timp real sau arhivate, atât structurate, cât și nestructurate, integrând perfect capabilități complexe relevante, cum ar fi învățarea automată și algoritmii grafici. Spark aduce prelucrarea datelor mari maselor. Fii atent!
Leave a Reply