You are on page 1of 16

Kako da krenem da vrtim Big Data - Apache Spark (Scala & Python)

Apstrakcije su, kao što svi već znamo, jedan od ključnih koncepata u razvoju sistema i savladavanju njegove
složenosti. One su gospodari ovog našeg sveta i neophodne su svuda. Na jednom nivou čine da softverkse
arhitekture postanu fleksibilnije i jednostavnije za promenu, pomerajući dizajn sa kruto uvezanih komponenti na
labavo povezane. Na drugom, daju developerima koncepte u programskim jezicima bliske čoveku u odnosu na
koncepte programskih jezika koji su bliski mašini. Opet na trećem smanjujući celu složenost u ISO/OSI 7-slojnog
modela komunikacije, gde jedan sloj pruža servis drugom sloju. Na sličan način ni Big Data tehnologije nisu
izolovan slučaj.
U prethodnom članku, videli smo neke osnovne komponente Hadoop ekosistema koji nam daje mogućnost za
paralelnu obradu ogromne količine podataka. MapReduce je programski model koji je omogućio da se zadaci
paralelizuju na klasteru mašina i da se postigne sve ono što konvencionalne tehnologije ne mogu, a tiče se
obima, brzine i raznovrsnosti podataka, poznatijim kao 3V (volume, velocity, variety). MapReduce je dokazao
svoju vrednost u praksi, ali kako su se zahtevi za obradom menjali u kontekstu V-ova, tako je i samo Hadoop
ekosistem dobijao sve veći broj komponenti koje su radile neke specifične zadatke koje sam MapReduce kao
takav nije mogao da uradi. Tako je nastao veliki broj komponenti koji Hadoop ekosistem ima, što praksi
potencijalno može biti veliko opterećenje u kontekstu održavanja postojećih rešenja, verzije i td.
Jedna grupa ljudi sa Berkley univerziteta, je odlučila da promeni pristup i da pokuša da izradi platformu koja
omogućava rešavanje većeg broja zadataka i koja je na određeni način uopštenje MapReduce modela. Tako je
Apache Spark nastao. U odnosu na MapReduce i razmišljanja, kodiranja i procesiranja u paradigmi 2 programa
sa različitim funkcijama: mapera i reducera, ApacheSpark uvodi koncept RDD-a, Resilient Distributed Dataset,
apstraktnijeg API-a koji programeru daje jednostavniji pogled na procesiranje i ne bavi se detaljima niskog nivoa
koje Spark preuzima na sebe. Takođe Spark može da radi u memoriji, što ubrzava rad u odnosu na MapReduce,
gde pustite procesiranje, rezultati operacija se upišu na HDD, zatim ponovo čitanju i to može da potraje. Ukoliko
npr. imate ~ 100 linija koda u Java-i rezultat procesiranja nije zadovoljavajući, a prošlo je 20 minuta od
procesiranja, vi treba da izmenite kod što će potrajati + 20 minuta na procesiranje i to može tako da se rastegne.
Sa Spark-om to vreme može da se sažme, pogotovo ako ste usmereni na analitiku i želite brzo da oprobate
neke algoritme mašinskog učenja i da imate neki mali hands-on nad podacima. Ovo definitivno nije članak
MapReduce vs Spark i u kojem slučaju je koji bolji, kojih ima brda na Web-u, niti se favorizuje jedan pristup, već
samo koristim mali otklon od MapReduce-a da objasnim osnovne koncepte. Ok.
Kada smo ukratko izdefinisali šta nećemo raditi, da krenemo na ono drugo i konfigurisaćemo Spark u nastavku.
U prethodnim člancima (Kako da krenem da vrtim Big Data), smo nasetovali mali Hadoop klaster preko virtuelne
mašine i tamo možete nastaviti da radite i da izvrtite neki primer u Spark-u koji vam se čini interesantan, a ja ću
nastaviti sa konfigurisanjem standalone Spark-a na 2 OS-a: Win i Ubuntu.
Instaliraćemo Apache Spark na operativnom sistemu Windows 10, sa Scala razvojnim okruženjem:
1. skinite JDK verziju sa Java 8 (ne za drugu verziju), trenutna Web adresa je:
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

1
2. nakon toga pokrenite fajl (npr. jdk-8u191-windows-x64.exe) koji ste skinuli, i pratite korake, kao kod
svake instalacije programa na Windows 10 okruženju, zapamtite da je program instaliran na putanji
sličnoj ili istoj ovoj C:\Program Files\Java\jdk1.8.0_191\
3. sada je potrebno postaviti Environment variablu, idemo u Control Panel -> System -> Advanced system
settings, i nakon toga pritisnite dugme Environment Variables... na dijalogu
4. za Variable name stavite JAVA_HOME, a za Variable value, stavite putanju gde ste instalirali Java-u,
npr. C:\Program Files\Java\jdk1.8.0_191
5. zatim editujte Path promenljivu i dodajte %JAVA_HOME%\bin

6. sada download-ujmo Spark sa stranice https://spark.apache.org/downloads.html


odaberimo poslednji verziju za 2.3.x, npr. 2.3.2 (jer mogu da se jave neki problemi kod verzije 2.4 za Win
10 OS)
2
7. Kada se skine build-ovan Spark, on će biti .tgz fajl, npr. spark-2.3.2-bin-hadoop2.7.tgz, preko WinRAR-
a ili nekog drugog softvera odpakujte pomenuti fajl i sve foldere i fajlove koji su sadržani u tom folderu
iskopirajte u neki folder u kojem će stajati Spark, npr. C:\spark, kao na slici

8. u sklopu conf foldera C:\spark\conf, reimenujte fajl log4j.properties.template, u log4j.properties


9. otvorite fajl log4j.properties iz nekog tekstualnog editora, npr. Notepad++, i idite otprilike na liniju gde
piše log4j.rootCategory=INFO, console i promenite INFO u ERROR, tako da bude
log4j.rootCategory=ERROR, console
10. sada je potrebno ponovo postaviti Environment variablu, idemo u Control Panel -> System -> Advanced
system settings, i nakon toga pritisnite dugme Environment Variables... na dijalogu
11. postavimo novu varijablu, gde je Variable name: SPARK_HOME, a Variable value: C:\spark

3
12. editujmo sada Path promenljivu i dodajmp %SPARK_HOME%\bin

13. sada, specifično za Windows, potrebno je da dodamo još jedan alat da bi sve ovo moglo da radi, sa Web
adrese: https://sundog-spark.s3.amazonaws.com/winutils.exe , skinimo winutils.exe
14. kreirajmo folder winutils, na C:\, a unutar njega folder bin i sada na tu putanju C:\winutils\bin, iskopirajmo
winutils.exe program
15. sada je potrebno ponovo postaviti Environment variablu, idemo u Control Panel -> System -> Advanced
system settings, i nakon toga pritisnite dugme Environment Variables... na dijalogu
16. postavimo novu varijablu, gde je Variable name: HADOOP_HOME, a Variable value: C:\winutils

17. sada možemo proveriti instalaciju Spark-a, pokrenućemo Command Prompt kao administrator
18. idemo sada na putanju gde smo instalirali Apache Spark, c:\spark, komandom cd c:\spark
19. pokrenućemo Spark pozivom programa spark-shell i vidimo na slici da je pokrenut sa Scala shell za
Spark (u slučaju da niste dobro nastovali varijable, potrebno je da zatvorite cmd i da ga nakon
nasetovanja ponovo pokrenete)

4
20. sada ćemo dodati malo Scala koda da pokrenemo Spark, tako što ćemo uraditi jednostavan primer,
iskoristićemo README.md fajl, kreirati RDD za svaku liniju teksta i nakon toga prebrojati pomenute linije

21. sa CTRL + d, izlazite iz Scala shell-a

Spark je sada konfigurisan pod Windows 10 OS, i sada je vreme da iskoristimo neki IDE, u našem primeru Scala
IDE for Eclipse, koji nam može pomoći u razvoju umesto da kucamo naš kod u Scala shell-u, preko REPL-a
(Read, Evaluate, Print, Loop) načina rada. Takođe potrebno je reći da Spark se izvršava pod Scala-om, a Scala
opet koristi JVM, što nekim manuelnim zahvatima može otežati razvoj i zato je bolje iskoristiit neki IDE, koji može
da se vrati u ranije verzije i postigne potrebnu kompatibilnost za onu verziju za koju vam je potrebno. Sa Web
adrese: http://scala-ide.org/download/sdk.html , skinite pre-konfigurisani Scala IDE for Eclipse. Kada raspakujete
pomenuti fajl, koji može da se zove scala-SDK-4.7.0-vfinal-2.12-win32.win32.x86_64.zip, videćete da u njemu
postoji folder eclipse koji ima već izbuild-ovano Scala IDE okruženje, pa kopirajte ceo folder na C:\, da ne bude
u podrazumevanom Downloads-u. Kreirajmo jedan folder za radno okruženje Scala IDE-a, npr. DemoSpark, na
putanji C:\DemoSpark. Pokrenimo Scala IDE i kao workspace odaberimo C:\DemoSpark.

5
Sada ćemo skinuti popularni MovieLens 100K dataset, koji sadrži ocene filmova sa Web adrese:
http://files.grouplens.org/datasets/movielens/ml-100k.zip , raspakovaćemo ga u folder DemoSpark, tako da na
putanji C:\DemoSpark\ml-100k imamo u.data, u.item i ostale fajlove iz ovog dataset-a. Sada se vratimo u
Scala IDE, i kreiraćemo novi projekat File -> New -> Scala Project, koji ćemo nazvati Demo.

Sada kreirajmo novi paket u ovom projektu, desnim dugmetom miša kliknite na Demo -> New -> Package i
paket nazvite nekim imenom, npr. rs.bigdata.spark i nakon toga pritisnite dugme Finish.

6
Sada kreirajmo Scala object, desnim dugmetom miša na paket rs.bigdata.spark -> New -> Scala Object i
nazovimo object Brojac.

Sada otkucajmo kod tako da izgleda:

Vidimo sada da u kodu imamo dosta prijavljenih grešaka i da ne može da pronađe Spark-ove pakete, tako da je
potrebno da ih dodamo u projekat. Desnim dugmetom miša kliknite na projekat Demo i zatim odaberite opciju
Properties. Idite na sekciju Java Build Path i odaberite tab Libraries.

7
Sada klinite na dugme Add Eternal JARs… i dodaćemo sve JAR-ove iz samog Spark-a, dakle sa putanje
C:\spark\jars.

Nakon što smo dodali sve potrebne JAR fajlove iz Spark-a, ono što može da se desi jeste da verzije Scala
programskog jezika nisu kompatibilne, gde je jedna verzija Scala-e korišćena za izradu Spark-a, a samo izvršno-
razvojno okruženje Scala IDE podrazumevano koristi neku drugu verziju. Sada je potrebno to da razrešimo, kao
i ranije kliknimo desnim dugmetom miša na projekat Demo i idite na sekciju Scala Compiler, označite checkbox
Use Project Settings i odaberite u ovom slučaju Fixed Scala Installation: 2.11.11 i kliknite OK i odaberite da se
projekat re-build-uje.

8
Sada kada pokrenete program dobićete rezultate na konzoli.

Kao što smo videli u prethodnim primerima sa MapReduce-om, najveći je broj filmova sa ocenom 4, barem za
ovaj dataset.

Sada ćemo videti kako se instalira Spark i pokreće pod Linux-om upotrebom python-a.
1. Potrebno je da skinemo Anaconda distribuciju python-a, za 3.x verziju Pyhon-a sa Web adrese:
https://www.anaconda.com/download/#linux, kada skinemo pomenuti fajl o moze da ima naziv:
Anaconda3-5.3.1-Linux-x86_64.sh

- u slucaju da ovo uputstvo ne bude dovoljno, mozete iskoristiti Web adresu:


http://docs.anaconda.com/anaconda/install/linux/

2. sada ćemo u terminalu otkucati sledecu komandu:


bash ~/Downloads/Anaconda3-5.3.1-Linux-x86_64.sh
Na taj način pokrećemo instalacioni proces za Anaconda-u, i sada je potrebno da ispratite instrukcije sa
terminala, tako da prvo pritisnite ENTER da nastavite, zatim je potrebno da se složite sa licencom tako što
otkucate yes, možete ostaviti podrazumevanu lokaciju instalacije, i u jednom koraku će proces instalacije
započeti.

9
U jednom trenutku instalacioni proces će vas usmeriti da se izjasnite da li želite da u sklopu instalacionog procesa
se sistemskoj promenljivoj PATH, pridruži anaconda i vi mozete odabrati yes, ali i u slučaju da odaberete no,
kasnije možete dokonfigurisati ovo modifikovanjem .bashrc-a preko nekog editor-a, npr. kucanjem komande:
gedit /home/slavimir/.bashrc, kada se iz editor-a otvori pomenuti fajl, samo dodajte sledeći red na kraj fajla:
export PATH=/home/slavimir/anaconda3/bin:$PATH

Nakon toga snimite vaš .bashrc fajl.

Takođe, u jednom trenutku prilikom instalacije na terminalu ćete imati pitanje da li da instalitate VSCode, tako
da to mozete izbegnuti kucanjem no.
Nakon toga, potrebno je da ponovo učitate .bashrc fajl u terminal:
source .bashrc

Sada možemo da proverimo da li je sve u redu, tako što ćemo u terminalu otkucati:
anaconda-navigator
I time pokrenuti Anaconda navigator.

10
Vidimo da je sve pokrenuto kako treba i ukoliko nam je neki od pomenutih alata potreban, možemo ga
instalirati, za sada cemo isključiti Anaconda navigator.
Dalje, nakon kucanja naredbe conda info, u terminalu, trebalo bi da dobijemo informacije kao na slici, gde
možemo da vidimo verziju conda-e.

Sada ćemo direktno pokrenuti Jupyter Notebook, kucanjem komande: jupyter notebook u terminalu, gde
vidimo da je notebook pokrenut u pretraživaču.

11
Takođe, Java nam je potrebna, tako proverite da li imate instaliranu verziju Java-e 1.8, kucanjem na
terminalu: java -version

Sada je potrebno da preuzmemo Apache Spark standalone distribuciju sa Web adrese:


http://spark.apache.org/downloads.html

NAPOMENA:
Poželjno je da još neko vreme koristite verziju Spark-a 2.3.X, mada verzija 2.4 bi trebalo da pod Linux-om i sa
Python-om radi kako treba.

12
Kada smo download-ovali Spark iz downloads direktorijuma, iskopiracemo taj neki .tgz fajl, npr. spark-2.4.0-
bin-hadoop2.7.tgz, u direktorijum tools, koji se nalazi i koji smo pre toga kreirali u direktorijumu home:

Sada ćemo otpakovati pomenuti fajl putem komande:

Sada se standalone Apache Spark nalazi u direktorijumu spark-2.4.0-bin-hadoop2.7.

Sada je potrebno da za Spark podesimo Enviroment variable-u, tako što na ranije opisani način preko gedit-a
(ili nekog drugog editora) otvorimo fajl .bashrc i promenljivoj SPARK_HOME dodelimo putanju do direktorijuma
Spark-a, i sve to nadovežemo na PATH promenljivu:
export SPARK_HOME="/home/slavimir/tools/spark-2.4.0-bin-hadoop2.7"
export PATH="$SPARK_HOME/bin:$PATH"

Kao i ranije nakon toga izvršimo komandu: source .bashrc

Sada imamo standalone Spark na našoj mašini i to možemo da proverimo pozivom Python shell-a za Spark,
komandom: pyspark i otprilike trebalo bi da dobijete isti ispis kao kada smo pozvali Scala shell za Spark pod
Windows-om, u prvom delu ovog članka:

Umesto da koristimo pyspark shell direktno, konfigurisaćemo Jupyter Notebook tako da pyspark shell može da
se pozove iz notebook-a. Zato je potrebno da podesimo neke dodatne Environment promenljive u .bashrc fajlu,
tako što ćemo na kraj fajla dodati sledeća 3 reda:

13
export PYSPARK_SUBMIT_ARGS="pyspark-shell"
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS='notebook' pyspark

Kao i ranije, nakon toga izvršimo komandu source .bashrc.


Sada kada u terminalu otkucamo pyspark, vidimo da se pokrece Jupyter Notebook:

14
U root direktorijumu kreirajmo direktorijum projects, unutar njega direktorijum demo, a unutar njega direktorijum
datasets, u kojem će se nalaziti dataset-ovi.
Sa Web adrese: https://grouplens.org/datasets/movielens/
Skinućemo popularni dataset ml-100k i raspakovaćemo ga tako da se direktorijum ml-100k nalazi u direktorijumu
datasets i u njemu će se nalaziti fajlovi u.data, u.item i td.

Ceo kod će stajati u direktorijumu code, koji se nalazi unutar direktorijuma demo.

Sada iz direktorijuma code, pokrenimo Jupyter Notebook, kucanjem komande pyspark.

Sada ćemo kreirati notebook klikom na dugme New u pretraživacu, gde je učitan Jupyter Notebook. Za Notebook
odaberimo Python. Kada se otvori drugi tab u pretraživaču i u njemu prikaže notebook snimite ga pod imenom
Demo1. Kada ubacite ceo kod u Notebook cell, kao na slici i pokrente, dobićete rezultat kao u primeru sa Scala-
om:
15
Ovo je jedan od načina da konifgurišete standalone Apache Spark pod Windows-om 10 i Linux-om, naravno vi
možete korisiti samo nešto od ovoga, a promeniti vaš IDE, distribuciju ili nešto treće, naravno to može da
proizvede veže ili manje izmene u konfigurisanju . Takođe, možete primetiti kako su i Scala i Python veoma
elegantni programski jezici.

To je to, do sledećeg članka.

referenca: https://sundog-education.com/

Pozdrav,
Slavimir

16

You might also like