Blog

Zašto svi pričaju o Apache Sparku?

Pitate se kako s podacima upravljati u realnom vremenu i batchu? Spark 2.0 je rješenje koje tražite.
, 23.01.2017.

Spark već postoji neko vrijeme, mi ga aktivno pilotiramo, osluškujemo. Ovim blogom želimo vas upoznati s Apache Sparkom, dati vam adekvatnu retrospektivu te najaviti ključne značajke koje dolaze sa Sparkom druge generacije. U narednim blogovima pisat ćemo detaljnije i donositi konkretne primjere, no krenimo redom, od samog početka, odnosno vizije Apache Sparka.


Koncept Apache Spark

Koncept Apache Spark

U produkcijskim okruženjima Spark je implementiran više od 1000 puta i vrti se na velikim clusterima s više od 8000 nodova. Ova tehnologija je definitivno spremna za korištenje u širokoj primjeni. Zašto?

Vrlo jednostavno – jer radi brzo, efikasno i stabilno. To nije zadovoljavajući odgovor… Opet zašto? Jedan od razloga je taj što je nastao na sveučilištu. Sveučilište UC Berkeley objedinilo je nekoliko stručnih radova na temu SQL -a u MPP svijetu, napravilo bezbroj pokusa i benchmarka te je u konačnici napravio puno pogrešaka i iz njih jako puno naučilo (“Fast-fail collaborative culture”). Dakle, ono što dolazi iz akademske zajednice trebalo bi imati smisla i raditi! Znatiželje u nama  je porasla početkom 2015. godine. Apache Spark je tada bio verzije 1.3. Spark se integrira u gotovo sve postojeće sustave koji trebaju procesuirati podatke, yeah right!. OK, misli moja tehnička glava, misli sve je to prodajna strategija, naštimani benchmarci, samo jedna od Big Data tehnologija i sve je to neki uobičajeni buzzword. A onda smo se odlučili okušati u tome i izazvali smo Spark na korisničkom zahtjevu kojeg optimiziramo godinama, koji ima limitirajuće tehnologije i korisničke infrastrukture. Nakon dva dana istraživanja Sparka i pripremanja okruženja zaključak je da je brzina odaziva Sparka impresivna. Na našem prvom PoC-u jako smo se ugodno iznenadili. Korisnički zahtjev uobičajeno se izvršavao oko 6-7 sati, a ponekad se nikad nije izvršio u produkcijskom tradicionalnom i relativno snažnom okruženju. Kada smo ga prepisali na Spark koji se vrtio na laptopu, naš upit se prosječno izvršavao unutar 45 sekundi. Da, dobro ste pročitali! 45 sekundi nasuprot 6 sati. I tek tada mi je bilo jasno zašto iskače iz svih silnih buzzworda i zašto svi pričaju o tome. Pa ovo stvarno radi.

Ajmo dalje…. E sad kako Apache Spark radi? Pitate se zašto je tako brz i što je tajna uspjeha? Spark radi u Clusteru što znači da treba imati starješinu (Driver program) koji koordinira sa svim raspoloživim egzekutorima u clusteru kojih nazivamo Worker nodovi. Dakle imamo starješinu i cluster managera kao master i pregršt vojnika/šljakera (Workeri/executori). Kažete ništa specijalno uobičajena master/slave arhitektura. Diver je jedan JVM proces koji  komunicira s egzekutorima koji su zasebni JVM procesi.

Spark Core architecture

Spark Core arhitektura

Spark Driver ima dvije ključne radnje. Prva radnja je konvertiranje korisničkog programa, tj. formiranje fizičkog plana procesiranja i definiranje Spark taskova ovisno o konfiguraciji. Druga uloga je koordinacija izvršavanja raspoređenih individualnih taskova nad egzekutorima u Worker nodu. Ono što je ovdje bitno je da Driver kreira fizički plan i raspoređuje taskove na one egzekutore, tj. na ona mjesta gdje određeni podatak egzistira s osnovnim ciljem da se izbjegne shuffling kroz mrežu. Osim toga Driver brine o lokaciji cacha u cijelom clusteru i pozicionira ga na mjesto koje je najoptimalnije za sve pripadajuće egzekutore.

Spark Core engine baziran je na MapReduce frameworku. Od osnovnog hadoop koncepta preuzeo je dobre recepte za linearnu skalabilnost i fault tolerance, a postojeći MapReduce proširio s tri vrlo bitna sastojka. Prvi, u trenutcima kada MapReduce mora raditi zapisivanje na distribuirani sustav, Spark može direktno spustiti u sljedeći korak obrade (transformaciju). Dakle, ovdje se izrazito reducira disk I/O operacije [ms], tj. sve se izvršava u radnoj memoriji [ns], od transformacije do transformacije dobije se niz jednog batcha, 100% in-memory. Drugi bitni sastojak odnosi se na pripremljene brojne transformacije koje korisnik (developer, analitičar) razumije na prirodan način. Ovdje postoje  brojni dodatni API-ji koji omogućuju da radite na razini SQL-a. Treći, ne manje bitan sastojak je to što Spark procesiranje odrađuje isključivo in-memory. Resilient Distributed Dataset (RDD) je apstrakcija koja programeru omogućuje da transformacije odrađuje in-memory kroz cijeli cluster, što znači da set podatak koji je jednom učitan ostaje raspoloživ dokle god ima potrebe za njegovim radom. Ovakvim pristupom izbjegavamo ponovno učitavanje i računanje s diskovnog sustava. E sad, pitamo se trebaju li nam mašine s pregršt RAM-a. Odgovor je DA, ali ne nužno. Ovakav pristup je bolji i u “neklasteriranom” načinu rada, zato što Spark maksimalno iskorištava RAM tamo gdje egzistira sam podatak uz maksimalni paralelizam, pri tome maksimalno reducira I/O operacije i network shuflling unutar clustera ili jedne mašine.

Spark Core & more

Na opisanu osnovnu arhitekturu, Spark dodaje mnoštvo korisnih i funkcionalnih API-ja koji daju dodatni sloj apstrakcije kako bi s jedne strane developeru smanjio posao (Spark reducira pisanje koda do čak 20x), a s druge strane naprednim analitičarima i DataScientistima omogućio jednostavniji pogled i procesiranje informacije. Jedna od inicijativa i smjernica za razvoj Sparka je da riješi problem Data Science okruženje u kojem Data Scientist gubi i do 80% svog vremena na pripremu i obradu podataka prije krucijalnih analiza. Na osnovu tog razmišljanja nastali su dodatni API-ji s ciljem da bitno olakšanju pripremu podataka:

  • Spark SQL – SQL API koji omogućuje da koristite standard SQL u Sparku, te tako strukturirane i  semi-strukturirane podatke obrađujete bez poznavanje programskih jezika
  • Spark streaming – je modul (API) za procesiranje podataka u realnom vremenu
  • MLib (machine learning) – modul (API) za strojno učenje.
  • GraphX – Modul (API)  za obradu Graph struktura nad Spark okruženjem
  • SparkR – modul (API) za pisanje R programa u Spark okruženju.
Komponente Apache Spark

Komponente Apache Spark

Spark 2.0 druga generacija

Nakon verzije 1.6., ovo je ljeto izašao Spark 2.0 koji donosi pregršt novina. Najveća promjena je usmjerena na optimizaciju, pojednostavljivanje i ujedinjavanje batch i streaming procesa.

Jedno od najvećih  poboljšanje odnosi se na optimizaciju – Spark se ubrzava 10x Tungsten 2.0 projektom kojem je glavna svrha Spark pozicionirati kao compiler. To znači da je ovim projektom Spark dobio “Native memory management” i “runtime code generation”. U verziji 1.6 Spark je djelomično generirao kod, a sada ga generira u potpunosti. Pored toga maknuti su elementi koji su generirali skupe pozive iteratora te je optimizirani in/out tako što su dodali Parquet built-in cache.

Tungsten faza 2

Tungsten faza 2

Druga bitna stvar je Structural Streaming. Structural streaming je namijenjen onim aplikacijama koje imaju zahtjeve za batch procesiranjem jednako kao i streaming procesom. Primjer toga je kad želimo selektirati podatke nad živim streamom i tada takav rezultat poslati na trening ML modela te ažuriranje podataka u gotovo stvarnom vremenu. Dakle, ovdje na jednom DataFrame objektu možemo raditi batch procesiranje i stream analitiku, a da pri tome ne narušimo konzistenciju podataka. Prije toga smo morali raditi na Lambda arhitekturi koja je kompleksna sama po sebi jer je bilo potrebno održavati dvije verzije koda, jedan za streaming (trenutne podatke), a drugi za batch (podatke), te ih poslije spajati kroz neki noSQL data store. Spark je i kod ovakvih slučajeva revolucionaran i omogućava developeru da kontrolira podatke nad jednim jedinim DataFrame-om.

Treće, bitno unaprjeđenje je unificiranje DataSet i DataFrame objekata. DataFrames je kolekcija redova unutar jasno definirane sheme, dok je DataSet statički tip podatka.

DataFrame = Dataset[Row]

Ako ne razumijete o čemu se točno radi, pratite naš blog jer u jedom od sljedećih tekstova ćemo se pozabaviti upravo time. 🙂  Ključna je ideja imati bogatiji apstraktni layer koji skriva programski kod i brine se dohvatu i procesiranju zahvaljujući Tungsten Projektu dok će RDD ostati i dalje podržan za low-level programiranje. SparkSession kao novina predstavlja SparkContext za DataFrame/Dataset i omogućuje rad na svim razinama od čitanja podataka, upravljanje s meta podacima, dodatne konfiguracije i naravno kontrola na razini cluster managera. DataSet i DataFrame sad podržava u potpunosti korelativne i nekorelativne SQL podupite što znači da Spark podržava SQL2003 standard. Spark od 2.0 verzije podržava pokretanje svih 99 TPC-DS* upita.

Osim ovih pogodnosti, Spark 2.0 donosi puno unaprjeđenja i poboljšanja i dodane su nove komponente: ML pipelines, SparkR StremingML, DebugUI, novi DataSources, Kafka connector i dr.

Primjena

Na jednom o webinara Matei Zaharia (tvorac Sparka) spontano je izjavio: “Kako je jedan od ciljeva bio dovesti naprednu analitiku za sve prigode.” 🙂 Drugim, riječima ideja je da svi korisnici i postojeće aplikacije koje koriste tradicionalni SQL mogu “zaživjeti” u big data svijetu. U kontekstu DataSciencea, cilj Sparka je biti nešto kao spreadsheet poslovnim analitičarima tako da federira sve izvore na jedan način i da omogući jednostavne upite SQL-om, a kompleksne upite/procedure/algoritme u programskom okruženju koje DataScientistu najviše odgovara.

Druga bitna primjena Sparka je u razvoju Continuous applications sustava kao što su primjerice recommended apps ili sustavi za Fraude detection. Ovo su aplikacije gdje je i dalje fokus na procesiranju svih podataka (history) + potreba za oplemenjivanjem podataka koji utječu na procese u realnom vremenu. Do sada takve stvari su se rješavale kroz tzv. Lambda arhitekturu što je bilo izrazito kompleksno i teško za razviti, a još teže održavati i deployati. Lambda je hack Spark 2.0. 🙂

Prevencija Frauda je idealan slučaj za Spark 2.0. jer ujedinjuje batch i streaming pri tome ne narušavajući konzistenciju podataka, s tim da ako podatak nije konzistentan Spark će inicirati pogrešku u runtimeu (Continuous applications). Spomenuti sustav za prevenciju frauda može se samostalno unaprijediti korištenjem jobova za strojno učenje (ML pipeline, MLib)…. Zamislite sustav koji sam može naučiti što je to Fraud? 🙂 … a da sve to kontrolirate kroz jednu jedinu aplikaciju/sustav (standalone + streaming) na brz i interaktivan način.

Za sam kraj retrospektive, a prije novog početka kod vas 🙂 

Spark je jedan od prvih unificiranih engina za procesiranje podataka u klasteriranom, distribuiranom sustavu koji integrira funkcionalne API-je. Spark će na ovim temeljima graditi nova API sučelja. U budućnosti će se svakako omogućiti samo više “computation semantics”. Matei Zaharia najavio je da ćete u bližoj budućnosti (dakle trenutno se razvija) moći kombinirati MLib i GraphX, GraphX i TensorFlow vjerojatno na razini samog unificiranog DataFrame API-ja. U tvornici Sparka dosta se radi na streamingu (Engine Latnacy ) i ML-u kako bi osigurali 24/7. Čeka nas svijetla budućnost. Također, DataFrame API će se ubuduće optimizirati s novim algoritmima kako bi bio optimalan na svim razinama apstrakcije. Spark je compution engine, a primarno nije  memory I/O manager, zato postoje bolje stvari kao što je primjerice Apache Tachyon (in-memory caching engine). Ipak kombiniranjem Sparka i Thyona mogu se postići određena unaprjeđenja, npr.tako da Tahyion unaprijedi cache i Spark jobovima na nodovima. Ufff  gdje nam je kraj… 🙂

Kako započeti sa Sparkom?

Apache Spark zahvaljujući svojoj polivalentnosti i unificiranosti može se koristiti u različite svrhe te različitim okruženjima. Ako ste analitičar koji zna samo SQL a ima problema s velikom količinom podataka, Spark je svakako dobro rješenje za vas jer omogućuje da korištenjem SQL-a, jezika kojeg poznajete, vrlo brzo prijeđete na procesiranje u gotovo stvarnom vremenu. Ako radite u Data Science okruženju Spark vam također može pomoći, tj. reducirati za čak 80% vrijeme koje vam je potrebno za pripremu podataka.

Nadamo se da ste iz ovih par crtica dobili odgovor što je Spark zašto se koristi i da će vas dodatno inspirirati da ga isprobate u vašem okruženju i s vašim podacima kako bi imali vaš osobni stav o tome. Ako se želite upustiti u Spark avanturu predlažemo vam naše Spark tečajeve:

  • Uvod u Apache Spark – detaljno upoznavanje sa Spark Core i Spark SQL konceptima na interaktivni način pišući kod i čitajući API doc, nasuprot statičnog PPT-a.
  • Apache Spark – napredno korištenje – Ako imate osnovno iskustvo sa Sparkom ovaj tečaj će vas nadograditi na Spark Streming, MLib za strojno učenje te korištenje GraphX API-a.

Ako vas još nismo uspjeli uvjeriti za adaptaciju Sparka u vašem okruženju pozivamo vas da čitate naredne blogove na temu Sparka. Bit će ih jer ovo je tek početak….

——–

* PC Benchmark™DS (TPC-DS): ‘The’ Benchmark Standard for decision support solutions including Big Data (http://www.tpc.org/tpcds/)

Tagovi:
Povratak