Kako iskoristiti sve prednosti Sparka u obradi podataka?

Data science alati često mogu biti komplikovani za korišćenje i održavanje, bez neke velike potrebe za tim. Spark je jednostavan za korišćenje, efikasan i ima sjajnu zajednicu oko sebe.

Miloš Milovanović - 14. Jun, 2016.

Big Data i Data Science kao termini i oblast više ne predstavljaju samo “buzzword” i trend o kome svi pričaju – veliki broj korisnika je shvatio benefite koje donose i uočio potrebu za ovim alatima. Često ti alati mogu biti komplikovani za korišćenje i održavanje, bez neke velike potrebe za tim.

U ovom tekstu osvrnuću se na alat koji je dobio na popularnosti i ušao u široku upotrebu zbog lakoće korišćenja i sjajnih performansi i funkcionalnosti koje donosi za rad sa podacima. Dodatna prednost mu je i sjajan community koji svakog dana radi na unapređenjima, kao i odlična dokumentacija.

Šta je Spark?

Apache Spark je open source projekat koji se razvija pod pokroviteljstvom Apache Fondacije, a čini alat za brzu i efikasnu obradu velikih količina podataka, i jedan je od najlakših Big Data alata za učenje i razvoj. Razlog za to leži u filozofiji koja stoji iza projekta:

Spark omogućava korišćenje ukupne RAM memorije klastera računara za izvršavanje kompleksnih i zahtevnih poslova pri radu sa podacima. Lako se skalira – veoma je lako proširiti ukupne kapacitete Spark klastera jednostavnim dodavanjem RAM memorije ili dodavanjem nove mašine u klaster.

Podatke predstavlja kroz svoje bogate strukture podataka, kao što su Resilient Distributed Datasets (RDD), DataFrames i Datasets. Pored memorije, mogu se skladištiti i na disku, i ta odluka je prepuštena programeru.

Pri obradi podataka ove strukture se mogu čuvati u radnoj memoriji, što značajno povećava performanse u obradi. Strukture podataka u Sparku su immutable, pa tako svaka operacija nad nekom strukturom generiše novu strukturu.

Greška koja se često pravi kada je reč o poziciji Spark-a u Big Data sferi je da se Spark smatra zamenom za Hadoop.

O tome zašto treba praviti razliku između ova dva alata mogli  ste čitati i ranije na Startitu. Spark može zameniti neke komponente u okviru Hadoop-a, kao što je MapReduce za obradu podataka, ali neke druge Hadoop komponente su nam i dalje potrebne, poput HDFS skladišta podataka.

U prethodnom periodu uloženi veliki napori u razvoj Sparkovih komponenti koje se koriste u obradi podataka. Neke od njih su:

Spark Streaming omogućava razvoj streaming aplikacija za rad sa podacima i obradu podataka kako oni pristižu na sistem. Ima mogućnost automatskog oporavka od otkaza, pa tako da ako se desi na neka mašina u klasteru otkaže, sav posao će se adekvatno rasporediti na druge mašine i nećemo izgubiti svoje podatke.

Spark SQL omogućava korišćenje SQL upita u eksploraciji i obradi podataka, kao i korišćenje u kombinaciji sa drugim komponentama. Koristeći DataFrame omogućava jednostavan pristup različitim izvorima podataka, kao što su JSON, Parquet, Hive ili relacione baze podataka kroz JDBC driver. Nama koji već u nekim sistemima imamo Hive strukture i upite omogućava da ih neizmenjene koristimo i na Spark-u. Kroz JDBC ili ODBC driver omogućava različitim BI alatima da koriste podatke kroz Spark.

MLlib komponenta zadužena je za razvoj algoritama mašinskog učenja na Sparku i nad velikim količinama podataka. Omogućava implementaciju velikog broja poznatih algoritama iz ove oblasti, kao što su klasifikacija, regresija, klasterovanje i mnogi drugi.

Spark se posebno ističe po performansama na ovom polju budući da razvijeni algoritmi postižu izuzetnu paralelizaciju, pa je omogućeno efikasno treniranje modela nad velikim podacima, i korišćenje modela za potrebe različitih aplikacija.

Python developerima može posebno biti zanimljiva integracija sa NumPy bibliotekom – modeli koje razvijate će koristiti osnovne koncepte preuzete iz ove efikasne biblioteke za izračunavanja

GraphX omogućava efikasan razvoj grafovskih algoritama i izvršavanje iterativnih graf obrada. Veliki broj često korišćenih algoritama je već implementiran u okviru biblioteke, poput, na primer, Page Rank algoritma.

Jednostavnost razvoja Apache Spark aplikacija se ogleda kroz veoma bogate API-jeve koji su podržani u programskim jezicima Scala, Python, Java i R. Pri API implementacijama su zadržani neki osnovni koncepti iz ovih programskih jezika koji mogu pomoći pri obradi podataka.

Tako da ako razvijate neki algoritam mašinskog učenja koristeći MLlib komponentu u PySpark-u (Python API za Spark), kalkulacije će se izvršavati koristeći NumPy biblioteku koja je veoma efikasna za ovakve zadatke.

Kako i kada ne koristiti Spark?

Razvojem aplikacija na Spark-u se bavim nešto više od godinu i po dana u kompaniji Things Solver i pokazao se kao odlično rešenje za brojne slučajeve korišćenja.

Ono što se meni lično dopada je da se u tom periodu pojavio veliki broj novih funkcionalnosti sa novim verzijama, a da je prelazak na noviju verziju bio lak i da nije bilo potrebno značajno menjati same aplikacije.

Često se dešavalo da funkcionalnost koja mi je bila potrebna, a nije bila dostupna u trenutnoj verziji bude omogućena već u sledećoj.

Kao odlično rešenje Spark mi je koristio za različite ETL poslove, posebno u situacijama kada je potrebno kombinovati različite izvore podataka. Na primer, ako je deo podataka smešten u JSON fajlovima, deo se nalazi u relacionoj bazi, a deo se nalazi u logovima, Spark je veoma jednostavno rešenje da se ti podaci integrišu, agregiraju i dalje koriste, budući da Spark podržava različite izvore podataka.

Još jedan slučaj korišćenja je obrada streaming podataka. Spark je veoma zgodno rešenje za ovakve zadatke, i koristim ga kada mi je potrebna obrada, recimo, Twitter podataka koji dolaze kroz streaming. Budući da se lako integriše sa različitim messaging sistemima, kao što je Apache Kafka, Spark Streaming aplikaciju možete hraniti raznovrsnim podacima iz različitih izvora.

Spark je dobro rešenje za ad hoc analize, eksploraciju podataka i interaktivnu obradu. U takvim situacijama najšeće koristim Jupyter Notebook kao razvojno okruženje koje mi omogućava interakciju sa podacima. Čuvanjem podataka u memoriji dobija se veoma brz odgovor na upite i postižu odlične performanse.

A kada konsolidujemo podatke, istražimo ih i želimo da uočimo neke zakonitosti koje su u njima sadržane, Spark MLlib je odlično rešenje za razvoj i treniranje modela mašinskog učenja. Performanse su još bolje integracijom sa Pipeline API-jem.

Naravno, kako ne postoji jedinstveno rešenje za sve probleme generalno, tako je i kod rada sa podacima. U nekim slučajevima je Spark totalno pogrešan alat, i njegovim korišćenjem problem ili neće biti adekvatno rešen, ili će biti dodatno zakomplikovan.

Jedan od takvih primera je pretraga pojedinačnih zapisa nad velikim količinama podataka. Na primer, ukoliko imamo neki od sledećih upita:

sqlContext.sql(“select * from some_large_table where id=123455”)

sqlContext.sql(“select * from some_large_table where field like ‘%abcd%’”)

oni će se izvršiti na Sparku, ali je njihova efikasnost veoma problematična, i izvršavanje može trajati veoma dugo.

Ukoliko su ovakvi upiti učestali, treba razmotriti korišćenje nekog drugog alata za takve stvari, jer Spark za ovo nije namenjen. U tom slučaju treba razmotriti korišćenje relacione baze, Elasticsearch, Solr ili nekog drugog rešenja koje je prilagođeno za takve potrebe.

Ukoliko je podatke u nekoj tabeli potrebno ažurirati, Spark se gotovo i ne može koristiti za rešavanje takvih slučajeva.

U okviru Spark SQL-a naredba UPDATE nije podržana. Formati fajlova sa kojima Spark najčešće radi nisu optimizovani za ovakve operacije, jer je potrebno obrisati stare zapise i dodati nove, što može kreirati veliku količinu malih fajlova. Dobra praksa prilikom rada sa Sparkom jeste nastojati da se izbegava rad sa malim fajlovima, jer takva situacija loše utiče na performanse.

Stack Overflow istraživanje

O popularnosti i značaju koji Apache Spark ima u Data Science svetu govori i ovogodišnje Stack Overflow istraživanje o stanju u programerskoj sferi.

Spark se nalazi na drugoj poziciji po popularnosti u okviru Trending Tech sekcije. Što je možda i značajnije, Spark se nalazi na prvoj poziciji u okviru sekcije tehnologija koje su najplaćenije u Americi, zajedno sa Scala-om, a na svetskom nivou je četvrta najplaćenija tehnologija.

Screen Shot 2016-06-13 at 1.00.32 PM

* izvor: http://stackoverflow.com/research/developer-survey-2016#technology-top-paying-tech-top-paying-tech-in-us

Kako početi sa Sparkom

Prve korake sa Sparkom nije teško napraviti. Potrebno je preuzeti neku od distribucija sa zvaničnog sajta projekta, i pratiti dokumentaciju (koja je po mom ličnom mišljenju odlična) koja će vas uputiti u instalaciju i pokretanje prvog Spark programa.

Uz preuzetu distribuciju dolaze i osnovni primeri sa pripremljenim setovima podataka, koji će vam omogućiti da napravite svoju “Hello world!” aplikaciju.

Od pre nekoliko dana kompanija Databricks, koja je najveći contributor na ovom projektu, je najavila da je Community Edition njihove platforme Generally Available. Potrebno je registrovati se svojom e-mail adresom, i dobija se pristup interaktivnom notebook-u (koji je gotovo identičan Jupyter Notebook-u) za testiranje i učenje Sparka.

U okviru Databricks Community Edition platforme čeka vas mnoštvo primera i kurseva za učenje Sparka sa već pripremljenim setovima podataka, a materijali pokrivaju sve Spark komponente. Community Edition je potpuno besplatan i dostupan svima.

Databricks nudi i komercijalno rešenje za rad sa Spark aplikacijama i korišćenje u produkciji, koje je veoma zgodno za korisnike koji ne žele da se bave konfiguracijom Sparka (koja može biti komplikovana) i održavanjem. Korisnik dobija notebook u kome se bavi razvojem i istraživanjem podataka, a Databricks se stara o konfiguraciji, infrastrukturi koja leži ispod i održavanjem.

Nezaobilazno štivo u učenju je i knjiga Learning Spark: Lightning-Fast Big Data Analysis.

Spark 2.0

Uskoro nam stiže i nova verzija sa dodatnim optimizacijama u pogledu performansi i novim funckionalnostima. Početkom juna održan je veliki Spark Summit, na kom je predstavljena i nova verzija ovog alata, Spark 2.0.

Spark 2.0 je dostupan za testiranje može se preuzeti sa zvanične stranice projekta, a krajem juna stiže i verzija stabilna za korišćenje u produkciji.

Značajniji noviteti koji nam dolaze su sledeći*:

* Izvor: https://databricks.com/blog/2016/05/11/apache-spark-2-0-technical-preview-easier-faster-and-smarter.html

Domaća Spark zajednica

A kakvo je stanje što se tiče Sparka u Srbiji?

Tom temom se bavimo i u okviru Belgrade Spark Meetup grupe. Naime, nedavno je u okviru Data Science Srbija zajednice pokrenut Belgrade Spark Meetup, sa ciljem okupljanja Spark profesionalaca i entuzijasta. Meetup je dodat i na svetsku mapu Spark meetupa.

U okviru redovnih okupljanja bavićemo se različitim temama i iskustvima koja su vezana za rad sa Apache Sparkom. O narednim događajima i temama možete se informisati na zvaničnoj Belgrade Spark Meetup stranici, na sajtu Data Science Srbija zajednice, kao i na stranicama Startita.

Naravno, tu sam za sva vaša pitanja, a na stranicama Data Science Srbije zajednice i Startita očekuje vas još tekstova o ovom korisnom alatu za obradu podataka.