Apache Spark – organizacija podataka

Ćao svima. 🙂 Nedavno su u okviru naše meetup grupe održana dva predavanja o Apache Spark-u. Prvi meetup je bio fokusiran na teoriju o HDFS-u i Spark-u, i sve one funkcionalnosti koje ove alate čine značajnim za rad sa podacima. Prezentacija je dostupna na SlideShare-u. Na drugom meetup-u smo govorili detaljnije o Spark-u, i pokazali demo aplikacije na okruženju koje nam je obezbedio Databricks, pa im se ovom prilikom zahvaljujemo na ukazanom poverenju.

Šta je Apache Spark i kako početi sa njim možete pročitati u tekstu Apache Spark – Kako početi? U ovom tekstu ću se detaljnije pozabaviti osnovnim organizacionim jedinicama podataka u Spark-u, o kojima smo govorili na prethodnim okupljanjima.

Resilient Distributed Datasets

Osnovu Sparka čine Resilient Distributed Datasets, odnosno RDDs. RDD predstavlja osnovnu apstrakciju memorije u Spark-u, koja developerima omogućava izvršavanje računskih operacija nad podacima unutar velikih klastera koristeći njihovu memoriju, i pritom čuva fault tolerance svojstvo, poput MapReduce-a. Ukoliko neka od mašina u klasteru ne može da završi neki zadatak, ili ima nekih problema sa hardverom, samo deo posla koji je bio na toj mašini će se ponovo izvršiti na drugoj mašini, bez uticaja na zadatke koji se izvršavaju na mašinama koje pravilno funkcionišu. Predstavljaju particionisane kolekcije objekata rasprostranjene u klasteru, koje se čuvaju u memoriji ili na disku. Neka od osnovnih svojstava RDD-ova su:

  • Immutability – predstavljaju strukturu podataka koja se ne može izmeniti. Prilikom izvršavanja neke operacije nad RDD-ovima koja zahteva njihovu izmenu ili generisanje neke nove promenljive, dobija se novi RDD. Na taj način više RDD komponenti oslikava različite verzije seta podataka, pa se dobija “mutable” svojstvo.
  • Lineage – za svaki RDD se čuvaju podaci o tome kako je isti dobijen. Ukoliko tokom izvršavanja programa dođe do otkaza neke mašine u klasteru, RDD-ovi se mogu ponovo iskalkulisati od nule, a da to pritom ne utiče na RDD-ove koji se nalaze na ostalim mašinama. Omogućeno je da ukoliko dođe do gubitka podataka iz bilo kojih razloga tokom izvršavanja nekog programa, ti isti podaci se mogu ponovo efikasno iskalkulisati. Pored toga, lineage omogućava lazy evaluation Spark transformacija podataka.
  • Fault tolerance – omogućena je kroz logovanje svih izmena nad setom podataka, odnosno pojedinačnim izmenama koje se izvršavaju nad mnoštvom zapisa. Postiže se kroz lineage i Write Ahead logove (veoma značajni za Spark Streaming).

RDD se može kreirati učitavanjem podataka iz nekog storage sistema, poput HDFS-a ili nekog drugog, transformacijom nekog postojećeg RDD-a, ili pozivanjem funkcije parallelize nad nekom listom podataka u Python-u (ukoliko se koristi Python API za Spark, poznatiji kao PySpark).

Dva tipa RDD operacija je podržano:

  • Transformacije. Osnovna karakteristika transformacija je da su lazy evaluated, što znači da kada se pozove neka transformacija nad nekim RDD-om, ništa se ne dešava. Zapravo, program tada samo pamti šta je potrebno uraditi, a sama transformacija će se izvršiti tek kada na nju naiđe neka akcija. Izvršavanjem transformacije se dobija novi RDD. Neke od najčešćih korišćenih transformacija su map, filter i join.
  • Akcije. Akcija je u Spark-u operacija koja se izvšava odmah. Pozivanjem akcije se izvršavaju i sve transformacije nad podacima koje su prethodno pozvane. Predstavljaju mehanizam kojim se uzimaju podaci iz Spark-a. Najčešće korišćene akcije su collect, koja u terminalu vraća podatke koji se nalaze u RDD-u, i count, koja vraća broj redova u RDD-u nad kojim je pozvana. Akcije uvek imaju neki output za krajnjeg korisnika.

Često korišćena funkcija u Spark-u je cache(), koja čuva u memoriji RDD nad kojim je pozvana. Na taj način korisnik koji razvija program obezbeđuje da mu se neki podaci koje će kasnije koristiti čuvaju u memoriji, kako se ne bi morali ponovo učitavati sa diskova.

Dodatna literatura o RDD-ovima je dostupna u radu Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing sa Berkley Univerziteta, gde je Spark i razvijen.

Spark Dataframes

Dataframe predstavlja često korišćenu apstrakciju podataka u mnoštvu programskih jezika za rad sa podacima. Predstavljaju strukturu podataka poput tabele ili matrice, gde se u svakoj koloni čuvaju merenja neke varijable, a svaki red predstavlja jednu opservaciju, odnosno jedan zapis. U R jeziku predstavljaju jednu od osnovnih struktura podataka, a u Python-u se mogu koristiti kroz Pandas bibilioteku.

Spark Dataframe predstavlja distribuiranu kolekciju podataka koji su organizovani kao tabela ili matrica. Po nekim osnovnim karakteristikama su slični RDD-ovima, jer se takođe mogu čuvati u memoriji, i podržavaju lazy evaluation. Osnovna razlika između njih se ogleda u tome što Spark može optimizovati Dataframe operacije, jer svaki Dataframe sadrži metapodatke o tipovima podataka koji se nalaze u kolonama, što nije slučaj kod RDD-a.

Spark Dataframe se može kreirati na više načina, poput učitavanja strukturiranih fajlova sa podacima (poput CSV i JSON fajlova), iz eksternih baza, od postojeće Hive tabele (ukoliko se koristi u kombinaciji sa Hadoop-om), transformacijom RDD-a, … Korišćenjem dataframe-ova u Spark programu omogućene su sve “konvencionalne” operacije nad podacima koje bismo imali u nekoj relacionoj tabeli, kao što su sečenje tabele, sortiranje redova, agregacije, join sa drugim dataframe-ovima, …

Dataframe kao koncept postoji u Spark-u od verzije 1.3. Poput RDD-a, i Dataframe-ovi podržavaju lazy evaluation, čime se smanjuju stanja čekanja prilikom izvršavanja programa i omogućava bolji pipelining procesa. Za rad sa njima je moguće pisati DSL jezik u Java-i, Scala-i ili Python-u. Pored toga, njihovim uvođenjem omogućeno je pisanje SQL upita u Spark programu, koristeći klasu SQLContext. Veoma lako se mogu integrisati sa Pandas dataframe-ovima ukoliko se koristi PySpark, a na taj način i sa ostalim Python bibliotekama za rad sa podacima.

Benefiti koji su postižu korišćenjem Spark Dataframe-ova se odnose na poboljšanje performansi izvršavanja programa i fleksibilnost manipulacije podacima. Posbeno je značajna integracija sa Pipeline MLlib API-jem, što unapređuje performanse algoritama mašinskog učenja u Spark-u. PySpark je postao i ravnopravan igrač u korišćenju za Spark programe u odnosu na Scala-u i Java-u, što se najbolje oslikava benchmark testom sprovedenim od strane kompanije Databricks:

Dataset API

Za Spark 1.6 najavljen je novi API, pod nazivom Dataset API, koji predstavlja ekstenziju Dataframe API-ja, i kojim se garantuju još bolje performanse, ali za to nam preostaje da sačekamo da Spark 1.6 bude spreman za download i korišćenje.

Apache Spark – Kako početi?

Kako Spark sve više dobija na popularnosti, rešio sam da pored Hadoop-a počnem da pišem više i o ovom alatu. Prvo da još jednom napomenem da Spark nije zamena za Hadooop, već jedan odličan dodatak. Mi u firmi se često igramo sa njim i dobijamo odlične rezultate. Ovaj tekst će biti o tome kako da podesite okruženje za testiranje Sparka.

Za razliku od Hadoop-a koji je malo teže testirati na laptopu ili desktop računaru, Spark možete sa lakoćom. Postoji nekoliko načina da to uradite. Pored svega toga, aplikaciju koju ste napisali na svom računaru možete da pokrenete i na klasteru uz male ili nikakve izmene.

Zahtevi i instalacija

Spark može da radi kako na Windows-u, tako i na UNIX-like sistemima. Pre svega morate da imate instaliranu Javu i da joj bude podešena putanja, Python 2.6+, R 3.1+ i naravno kako je i sam pisan u Scala-i potrebno je da imate i instaliranu Scala-u verziju 2.10.x. Pored toga poželjno je da imate instaliran i SBT i/ili Maven.

Sledeće, na download stranici potrebno je da skinete, preporučujem, poslednju verziju Sparka koja je već spremna za neku verziju Hadoop-a, kako vi to ne biste morali da radite. Možete da iskoristite OVAJ link. Uradite unzip fajla i smestite Spark u željeni folder (Program Files ili Home). Ono što ja radim jeste da pravim “symbolic” link kako biste lako mogli da menjate verzije.

~$ ln -s /putanja do sparka/spark-1.4.1 putanja/gde/želite/symlink

I naravno na kraju podesite Bash profil.

export SPARK_HOME= putanja do symbolic linka
export PATH=$SPARK_HOME/bin:$PATH

Nakon toga možete da probate da li ste sve uspešno podesili, pokrenite spark-shell ili pyspark.

sparkconsole

Postoji nekoliko načina na koje možete da pišete i testirate aplikacije. U konzoli, što i nije baš lepo, posebno ako su u pitanju kompleksniji programi ili ako želite da ih ponovo pokrećete, drugi način jeste da iskoristite svoj omiljeni IDE i da u njemu pišete Scala, Python ili Java kod. Mana kod ovakvog načina jeste to što je naporno stalno testirati odrađeno. Ali to nije sve, uz Spark su se razvijali i dodatni alati koji olakšavaju pisanje Spark aplikacija.

Apache Zeppelin

Ovaj alat se koristi u HDP-u, standardan je i u klasteru koji možete da podignete na Azure-u. Dosta je sličan IPython-u, čak i Databricks koristi sličan alat za svoju platformu. U principu koristeći ovaj alat ne morate da imate instaliran Spark, plus možete da ga koristite za još neke alate. Možete sa github-a da skinete poslednju verziju i ispratite uputstvo i tako lako dobijete okruženje za razvoj Spark aplikacija. Jedino nisam siguran kako radi na Windows-u, takođe Java nije podržana.

Pored toga izvršavanjem SparkSQL upita dobijate i automatski vizualizacije koje možete da ubacite na vaš sajt. Još jedan fin dodatak jeste što možete da odredite i vreme kad će vaša aplikacija da se pokrene.

Mislim da ovaj alat može da bude odličan i za produkciju, jer je moguće podesiti Zeppelin da koristi Spark na klasteru i ako korisitite pored toga Hive ili Cassandra-u, onda imate IDE za više alata.

IPython Notebook

Ako i vi volite Python i ako ste upoznati sa IPython-om onda to možete da iskoristite. Za razliku od Zeppelina koji može se reći da je baš orijentisan ka Spark-u, IPython možete da koristite samo za PySpark i ne pruža vam mogućnost automatske vizualizacije podataka. Pre se može reći da na ovaj način testirate Python i PySpark odnosno njihovu kombinaciju.

Prvo je potrebno instalirati IPython. Pretpostavljam da ako se neko opredeli za ovaj način, onda već ima i koristi ovaj alat. Takođe potrebno je podesiti Spark putanje kao na početku teksta.

Sledeće, potrebno je profil za Spark kako ne bi mešali sa drugim Python projektima.

~$ ipython profile create spark

Kreirajte fajl ako ne postoji

$HOME/.ipython/profile_spark/startup/00-pyspark-setup.py

Dodajte sledeći kod:

import os
import sys

if 'SPARK_HOME' not in os.environ:
    os.environ['SPARK_HOME'] = 'putanja do symbolic linka'

SPARK_HOME = os.environ['SPARK_HOME']

sys.path.insert(0, os.path.join(SPARK_HOME, "python", "build"))
sys.path.insert(0, os.path.join(SPARK_HOME, "python"))

Pokreniti novi profil:

~$ ipython notebook --profile spark

Testirajte da li je sve ok:

print SPARK_HOME
from pyspark import  SparkContext
sc = SparkContext( 'local', 'pyspark')

ipy

Pored ova dva alata možete isprobati i Spark-Notebook koji nisam još stigao da testiram. Probajte, pa javite utiske.

Lako testiranje je jedna od velikih prednosti Spark-a. Naravno, nikako nije preporučljivo na ovaj način koristiti Spark u produkciji. Nadam se da sam vam malo približio Spark. Namerno nisam hteo da ovaj tekst bude Spark demo, jer na ovaj način sada može bilo ko da se igra sa Spark-om. Demo možemo da ostavimo za novoosnovanu meetup grupu, pa ako ste zainteresovani, javite da se organizujemo. Nastavljamo da hadupujemo sa novim tekstovima o Hadoop-u i Sparku.

Hadoop i Apache Spark u Srbiji

Posle duže pauze vraćam se pisanju. Prošlo je nešto više od godinu dana od pokretanja bloga i jako sam zadovoljan, a nadam se da ste i vi. Analitika kaže da vas ima mnogo i da ste redovni, tako da je mene malo sramota što ja nisam, ali potrudiću se da to ispravim. Odmah da kažem da ovaj tekst neće biti pun tehničkih detalja, malo ću da vam pišem o Sparku, a malo o tome kako napreduje Hadoop u Srbiji i regionu.

Pre svega, moram da primetim da se o Big Data tehnologijama priča i kod nas, i to mnogo više nego pre godinu dana. Čak su i neke kompanije počele da razmišljaju na tu temu kako bi stvorile ili pojačale konkurentsku prednost. To je kolegu Miloša i mene navelo na ideju da pokrenemo firmu koja se bavi Big Data tehnologijama. Prvi klijenti su nam već ukazali poverenje, pa tako mogu da se pohvalim da smo jedina kompanija koja se usko bavi samo ovim tehnologijama. To znači da će novi tekstovi biti dodatno poboljšani novim iskustvima koje stičemo na projektima. Firma se zove Things Solver. Želim da napomenem da ovaj blog neće postati korporatvni i da će i dalje imati svrhu širenja znanja i svesti o Big Data tehnologijama sa akcentom na Hadoop-u. Za kratko vreme postojanja postali smo partneri sa Hortonworks-om i Clouder-om, pa dodatno možemo da doprinesemo ovom blogu i zajednici. Pored toga, prilično mnogo vremena je uloženo i u testiranje nekih novih tehnologija o kojima će biti reči u narednim tekstovima.

Možete očekivati da će Hadoop Srbija aktivnije sarđivati i sa ostalim IT zajednicam u Srbiji. Naime, bio sam predavač na dve značajne domaće konferencije, #Tarabica i ITKonekt. Pozitivno sam oduševljen odzivom ljudi. Nadam se da ćemo biti u mogućnosti da i mi organizujemo jedan Hadoop događaj. Voleo bih da se jave svi oni koji čitaju blog, a imaju relevantna iskustva kako bi ih podelili ovde.

Na početku sam spomenuo Spark koji je relativno nova tehnologija i za godinu dana je osvojio dosta poena na tržištu Big Data alata. IBM je pre nekoliko dana objavio da će 3500 njihovih developera i istraživača pomoći u dodatnom razvoju ovog alata. Proteklih dva meseca smo se aktivno bavili ovom tehologijom i nismo je još primenili u produkciji, ali se nadam da ćemo uskoro. Spark je jak, jednostavan alat i predlažem da ga testirate. Ako znate Javu, Skalu ili Python, doslovno vam treba 5 minuta da probate najjednostavnije primere koje možete da pronađete na Apache Spark zvaničnom sajtu. Neki kažu da je Spark zamena za Hadoop, uskoro ćete imati priliku da pročitate moje mišljenje o tome na Startit.rs. Stoga neću dalje nastaviti o njemu, ali je sigurno da će Spark dobiti značajno mesto i na ovom blogu.

Kao što sam rekao, voleo bih da vidim i nova lica koja pišu za hadoop-srbija.com, tako da javite se i šaljite na mail sugestije. Imam u planu dosta tekstova i događaja. Nastavljamo da hadupujemo punom parom.