Apache Storm

U prošlom tekstu sam spomenuo Storm u kontekstu obrade podataka u realnom vremenu. U ovom tekstu pisaću malo detaljnije o Storm-u, o tome šta je, kako radi, kako se programira i pomenuću neke primere. Preporučujem da pročitate tekst Hadoop i obrada u realnom vremenu pre nego što nastavite.

Šta je to Storm?

Storm je open source alat za distribuiranu obradu podataka u realnom vremenu. Tačnije, ovaj alat se koristi kada želite da obradite podatke u trenutku kada su nastali (Streaming Analytics).  Storm se zbog svojih karakteristika našao kao neizostavni alat u Hadoop ekosistemu ako govorimo o obradi podataka u realnom vremenu. Ako se pitate čemu služi, lista odgovora bi mogla da bude duga. Neki od najčešćih zadataka Storma bi bili: ETL, obrada u realnom vremenu, online machine learning, ako želite da vršite konstantne proračune… Ako dovoljno upoznate alat, verovatno možete da proširite ovaj spisak.

Kada govorimo o brzini Storm-a, ako pogledamo testove, sposoban je da obradi milion redova u sekundi po mašini. Naravno da ovo zavisi i od same mašine. Skoro sam malo testirao Storm i mogu reći da sam bio oduševljen. Nisam uvodio nikakve testove, već je ovo moje zapažanje, koristeći virtuelnu mašinu sa možda 2GB radne memorije.

Kako radi?

Ako pogledamo arhitekturu Storm klastera, ona dosta liči na Hadoop arhitekturu. Kod Hadoop-a imamo MapReduce poslove, dok kod Storma imamo topologije. Postoje velike razlike, ali ako gledamo glavnu razliku, onda možemo reći da se Hadoop posao nekad završi, dok topologija traje beskonačno (osim ako je ne isključite). I Storm ima svoj Master node i Worker nodes, ali u ove detalje neću da ulazim previše, već želim da se fokusiram na topologije.

storm-topology1Topologija je običan DAG (Directed Acyclic Graph) koji se sastoji od Spout-ova, koji predstavljaju izvore podataka, odnosno čvor koji čita podatke sa nekog izvora. Druga komponenta je Bolt, čvor koji obrađuje podatke. Jedna Storm topologija može da kombinuje više Spout-ova i Bolt-ova. Tako da možemo da imamo dva izvora, npr. jedan je twitter koji traži samo tvitove koji u sebi sadrže #hadoop, a drugi bi tražio #storm. Sledeće, koristili bi jedan Bolt koji broji ukupan broj tweet-ova za ove dve reči čitajući iz ova dva Soput-a. Tako da možete da se igrate topologijom. Što se tiče modela podataka Storm na sve gleda kao na Tuple.

Programiranje

Lepo je znati teoriju, ali treba je iskoristiti. Storm je jako interesantan alat i poput Hadoop-a podržava višejezičnost. Spout-ove i Bolt-ove je moguće pisati u raznim programskim jezicima, Java je standard, a sam alat je pisan u Clojure programskom jeziku. Ja lično volim da testiram Storm pišući u Pythonu, brzo se piše, možete da se poslužite Yelp-ovim modulom koji stvarno olakšava život. Celu topologiju je moguće napisati u samo Python-u, ali isto tako moguće je pisati delove u Javi delove u Pythonu. Čitajući o tome koji programski jezik da izaberem, naišao sam na razne odgovore. Neki moj savet je ako niste Java programer da počnete lagano za jezicima kao što su Python ili Ruby. Ako to reši vaš problem, topologija ima smisla i na kraju rešili ste neki poslovni problem uvek možete da prepišete Python kod u Javu. U svakom slučaju prva stanica treba da vam bude zvanična dokumentacija.

Programiranje Bolt-ova podrazumeve da znate i Storm grupisanja, bez obzira koji jezik koristite ovo uvek važi.

  • Shuffle – Šalje tuple-ove u bolt na slučajan način, koristi se npr. za matematiku.
  • Fields – Šalje podatke na osnovu jednog ili više polja.
  • All – Šalje jednu kopiju svakog tuple-a svim primaocima.
  • Custom – Prilagođeno za obradu sekvenca.
  • Direct – Izvor odlučuje kom Bolt-u da prosledi podatke.
  • Global – Podaci se šalju sa više izvora na jedan Bolt, tipično je za operaciju brojanja.

Kako početi.

Za neki brz primer predlažem, a u slučaju da niste upoznati sa Javom, Python modul Pyleus koji je razvijen od strane Yelp-a i može se naći na gitu. Tamo možete pronaći par primera i odlično uputstvo. Za one koji su upoznati sa Javom destinacija je Storm zvanični sajt.

Bez obzira koji operativni sistem koristite preporučujem da koristite virtuelnu mašinu sa Ubuntu operativnim sistemom. Moj predlog je da se upoznate i sa Vagrant-om, i na taj način testirate, i na kraju možda podelite i sa drugima. Ja ću se potruditi da sredim jednu mašinu i okačim na Internetu, koja bi služila za testiranje Hadoop-a, Storm-a i možda još nekih alata.

I na kraju ako uporedimo Hadoop i Storm vidimo da u kombinaciji mogu da budu jako moćni i da reše probleme brzine koje ima Hadoop. Nastavljamo dalje da hadupujemo i da širimo Hadoop priču i kod nas i regionu.

 

Unapređenja Hive 0.14 verzije

Od svog nastanka do danas, Hadoop je prolazio kroz veoma dinamičan razvoj. Danas je jedna od standardnih platformi za Big Data okruženje. Kroz taj razvoj veliki broj alata je nalazio svoju primenu u takvom okruženju i korišćen je za potrebe analiza i obrade podataka. Međutim, mnoštvo tih alata je i napuštalo ekosistem, ili njihova primena nije dobila na velikom značaju. Alat koji je našao standardnu primenu u Hadoop ekosistemu je Apache Hive.

Apache Hive predstavlja data warehouse alat za Hadoop. Omogućava upravljanje velikom količinom fajlova i analizom podataka koje ti fajlovi sadrže. U Hive je ugrađen “SQL like” upitni jezik, koji se naziva Hive Query Language, i koji omogućava manipulaciju podataka u Hadoop-u pisanjem upita koji su gotovo identični standardnim SQL upitima.

hive_logo

Na samom početku Hive se koristio za batch obrade podataka. Međutim, do danas je došlo do velikog razvoja ovog alata, i on definitivno više nije samo za batch obrade. Detaljnije o Hive-u možete pročitati u tekstu Hive, SQL za Big Data, a u ovom tekstu se bavimo značajnim unapređenjima koje je donela verzija 0.14 na polju transakcija i ACID svojstava.

Apache Hive 0.14 je dostupan od novembra 2014. i nastao je kao rezultat Stinger.next inicijative. Stinger.next predstavlja open source inicijativu koja kao primarni cilj ima unapređenje Apache Hive-a, i donošenje svih pogodnosti iz tradicionalnih Data Warehouse alata u Hadoop okruženje, odnosno omogućavanje Enterprise SQL-a u Hadoop okruženju. Veliki broj developera je dao svoj doprinos kroz ovaj open source projekat, uključujući i developere iz velikih kompanija kao što su Microsoft, Informatica, Tableau…

Cost Base Optimizer – CBO

Sa verzijom 0.14 stigao je i sofisticiraniji cost based optimizer, koji izrađuje plan upita u zavisnosti od statistike podataka. Time su omogućeni kompleksni join-ovi velikih fakt tabela. Na ovaj način je značajno ubrzano izvršavanje upita.

SQL Temporary Tabels

SQL privremene tabele postoje dok traje korisnikova sesija, a zatim nestaju. Omogućavaju korisnicima i BI alatima da čuvaju privremene rezultate, i dalje ih procesiraju kroz upite. U starijim verzijama Hive-a privremene tabele se nisu mogle koristiti.

Transakcije sa ACID svojstvima

Ovo unapređenje je najznačajnije u verziji 0.14. Omogućava modifikovanje podataka u tabelama korišćenjem standardnih SQL naredbi – Insert, Update i Delete. Za izmene se koriste lock-ovi nad tabelama. Uvođenjem ovih naredbi omogućene su korekcije fakt tabela i izmene dimenzionih tabela u data warehouse-u u Hadoop-u.

Pre nove verzije, Hive je korišćen kao write-once, read-often sistem, gde su korisnici koristili particije podataka, i često izvršavali upite nad tim podacima. Ova paradigma je napuštena, kako bi se omogućila analitika nad podacima koji se menjaju u vremenu i izveštavanje sa izmenjenim podacima i operativnim bazama. ACID predstavlja značajan iskorak na ovom polju, omogućivši SQL transakcije sa izmenama i brisanjem podataka iz tabela.

Kao rezultat je pored ACID transakcija omogućena i podrška SQL semantike, povećana je brzina izvršavanja upita i unapređeno skaliranje, i primena standardnog SQL-a i potpunijih izveštaja.

ACID i transakcije u Hive-u

ACID predstavlja akronim za četiri osobine transakcija nad bazom podataka:

  • Atomicity (atomnost) – operacija je ili skroz uspešna ili neuspešna, ne ostavlja parcijalne izmene i podatke.
  • Consistency (konzistentnost) – kada se jedna operacija završi, rezultat te operacije je vidljiv svakoj drugoj operaciji.
  • Isolation (izolovanost) – operacija jednog korisnika ne sme da ugrožava operaciju drugog korisnika.
  • Durability (trajnost) – kada se operacija završi, njen rezultat je trajan i očuvan i u slučaju otkaza mašine ili sistema.

Osnovni cilj Stinger.next inicijative je proširivanje broja scenarija korišćenja Hive-a za potrebe rešavanja problema velikih kompanija. Proširenja koja je donela verzija 0.14 se odnose na:

  • Izmene vrednosti kolona dimenzionih tabela. U tipičnoj star schemi data warehouse-a dimenzione tabele se polako menjaju u vremenu. Na primer, prodavac možda otvori novu radnju, pa je potrebno dodati je u tabelu. Ili je kupac promenio adresu stanovanja ili kontakt informacije, pa je i njih potrebno izmeniti. Hive sa ACID osobinama donosi mogućnost ovakvih izmena.
  • Prepravljanje podataka. U nekim slučajevima može doći do pogrešnog unosa nekih redova u tabeli, pa je te redove potrebno obrisati. Ili je istekao ugovor potpisan sa nekim od dobavljača, pa je tog dobavljača potrebno obrisati iz tabele. Verzije Hive-a pre 0.14 u ovakvim situacijama kao rešenje jedino omogućavaju kreiranje nove tabele, ili izostavljanje neispravno unetih redova iz svih narednih upita. Verzija 0.14 omogućava brisanje redova iz tabele standardnom SQL naredbom.

Osnovni dizajn

HDFS fajl sistem donosi ograničenja u vidu nemogućnosti direktne izmene fajlova, ili u nemogućnosti konzistentnog čitanja fajla koji se uređuje od strane nekog drugog korisnika. Kako bi bilo moguće omogućiti transakciona svojstva nad podacima koji su upisani u HDFS i koji su manipulisani Hive-om, praćeni su standardi koji se primenjuju i u tradicionalnim Data Warehouse alatima. Podaci koji se nalaze u tabeli čuvaju se u osnovnim fajlovima. Sve izmene, novi podaci ili obrisani podaci se čuvaju u delta fajlovima. Prilikom svake transakcije koja donosi neke izmene nad podacima u tabeli se kreiraju novi delta fajlovi. U vremenu čitanja podataka se izvršava merge osnovnih i delta fajlova, i na taj način se izvršavaju update-i u brisanje podataka. Kako bi bilo moguće izvršavanje ovih merge-ova, u Hive metastore su dodate niti koje utvrđuju kada je potrebno pokrenuti merge, i koje se izvršavaju u pozadini kako rad sa podacima ne bi bio usporen ili onemogućen. Nakon završetka svih procesa čitanja “starih” fajlova, brišu se svi stari fajlovi. Prilikom merge-ovanja fajlova pokreće se kompakcija fajlova. Primenjuju se dve vrste kompakcije fajlova – minor i major kompakcije. Minor kompakcije su one kod kojih dolazi do prepisivanja manjih delta fajlova u veće. Major kompakcije prepisuju sadržaj delta fajlova u osnovne fajlove.

Upravljanje lock-ovima

Za potrebe upravljanja lock-ovima implementiran je DBLockManager. Sve informacije o lock-ovima se čuvaju u metastore-u, kao i informacije o transakcijama. Ovakvom implementacijom je omogućena trajnost transakcija i lock-ova, čak i u slučaju da dođe do otkaza servera. U cilju sprečavanja scenarija u kome bi u slučaju otkaza nekog klijenta koji ima pokrenutu transakciju ta transakcija ostala kao nedovršena u metastore-u koristi se heartbeat pristup. Klijent koji je pokrenuo transakciju ili postavio lock šalje heartbeat signal ka metastore-u u redovnim intervalima. U slučaju otkaza klijenta, gubi se i heartbeat signal i lock ili transakcija se brišu.

Konfiguracioni parametri

U Hive verziji 0.14 transakcije, insert, update i delete naredbe nisu omogućene podrazumevanim podešavanjima. Kako bi bilo moguće primeniti ih, potrebno je izmeniti neka konfiguraciona podešavanja. Postoji nekoliko mogućnosti za unošenje konfiguracionih podešavanja koji se tiču izvršavanja Hive-a. Često korišćen pristup je unošenje podešavanja iz Hive komandne linije, unošenjem naredbi:

set parametar=vrednost_parametra;

Na primer:

set hive.exec.scratchdir=/tmp/mydir;

Pored ovog pristupa, izmene se mogu unositi i direktno u hive-site.xml fajl, koji predstavlja osnovni konfiguracioni fajl za Hive. Na primer:

<property>

<name>hive.exec.scratchdir</name>

<value>/tmp/mydir</value>

<description>Scratch space for Hive jobs</description>

</property>

 

Verzija 0.14 donosi i mogućnost izmene podešavanja koja su specifična za server na kome se Hive izvršava, ali ta podešavanja nisu od interesa za potrebe ovog teksta.

Potrebna podešavanja za izvršavanje Hive transakcija su:

Potrebna podešavanja za izvršavanje naredbi Insert, Update i Delete su:

Svojstva tabele

Kako bi tabelu bilo moguće koristi sa ACID osobinama, potrebno je podesiti svojstvo transactional nad tom tabelom. Bez ovog svojstva, biće omogućen samo unos podataka, a ne i izmene i brisanje. Svojstva tabele se unose ili prilikom kreiranja table, uz naredbu Create Table, ili prilikom alterovanja tabele, uz naredbu Alter Table.

Izmene u pisanju upita

Ovakva unapređenja su nužno dovela do promene sintakse samog Hive Query Language-a. Dodate su DML naredbe INSERT…VALUES, UPDATE i DELETE. U DDL su napravljene izmene koje se tiču prvenstveno transakcionih svojstva tabela. Dostupne su komande SHOW TRANSACTIONS i SHOW COMPACTIONS, koje se koriste za prikaz svih transakcija i kompakcija koje su aktivne. Naredba SHOW LOCKS sada pruža informacije i o novim lock-ovima koji su vezani za transakcije.

 

Deo opisanih funkcionalnosti možemo prikazati primerom. Pre pokretanja Hive komandne linije su napravljene navedene izmene u hive-site.xml fajlu.

Nakon unetih izmena potrebno je startovati Hive komandnu liniju (ili Hive editor koji dolazi uz Hue web interfejs ukoliko ga koristite. Pokrećemo sledeću skriptu koja kreira tabelu sa osnovnim podacima o zaposlenima u nekoj organizaciji:

 

create table zaposleni (id int, ime string, plata int, odeljenje string)

clustered by (odeljenje) into 3 buckets

stored as orc TBLPROPERTIES (‘transactional’=’true’) ;

 

Zatim u navedenu tabelu unosimo podatke o zaposlenima:

 

insert into table zaposleni values

(1, “Pera”, 75000, “A”),

(2, “Mika”, 80000, “A”),

(3, “Zika”, 76000, “B”),

(4, “Laza”, 92000, “C”);

 

Nakon unetih podataka želimo da zaposlenom sa id-jem 1 (Pera) povećamo platu:

 

update zaposleni set plata=83000 where id=1;

 

Uspešnost ažuriranja plate zaposlenog možemo proveriti pokretanjem naredbe:

 

select * from zaposleni

where id = 1;

 

čime će nam se ispisati ažurirana vrednost plate.

 

Takođe, iz ove tabele možemo izbrisati podatke o nekom zaposlenom koji je napustio firmu, pokretanjem naredbe:

 

delete from zaposleni where id=3;

 

Uspešnost prethodne naredbe možemo proveriti izlistavanjem svih podataka iz tabele o zaposlenima, gde ćemo primetiti da nedostaju podaci o obrisanom zaposlenom:

 

select * from zaposleni;

 

Ograničenja

Iako unapređenja verzijom 0.14 donose velike pogodnosti za rad sa transakcijama, postoje i neka ograničenja, koja će biti predmet budućih unapređenja i sledećih verzija. To su pre svega:

  • BEGIN, COMMIT i ROLLBACK još uvek nisu podržani, već se sve operacije automatski izvršavaju. Njihovo uvođenje se očekuje u sledećoj verziji.
  • Samo ORC format fajla je podržan. Integracija za ostale formate se očekuje u narednim verzijama.
  • Po podrazumevanim podešavanjima transakcije su isključene. Kako bi se mogle koristiti, potrebno je dodatno modifikovati podešavanja.
  • Tabele moraju imati bucketed svojstvo.
  • Podržana je samo izolovanost na nivou snapshot-a.

O svim unapređenjima koja su do sada došla u odnosu na Hive verziju 0.14, kao i o unapređenjima koja tek dolaze pisaćemo u nekim budućim tekstovima.

Apache Sqoop

Nastavljamo priču o tome kako uneti podateke u Hadoop klaster, odnosno u HDFS. Ovaj tekst je o Sqoop-u, jednom interesantnom alatu i veoma lakom za korišćenje. Ovim tekstom završavam priču o unošenju podataka.

Šta je Sqoop?

Sqoop je alat koji služi za prenos podataka iz i u Hadoop klaster. Njegova posebna namena je da radi sa relacionim bazama podataka. Osim transfera podataka u HDFS, Sqoop može direktno da radi sa Hive-om ili HBase-om. Prednost Sqoop-a je što brzo prenosi podatke unutar HDFS-a.

Testirao sam ovaj alat, tako da mogu da potvrdim da je jako brz, ali relacionu bazu od oko 4GB je uneo u HDFS za oko minut, možda i manje. Napomenuo sam da je lak za korišćenje i to je potpuno tačno, jedan je od retkih alata u Hadoop ekosistemu koji naučite za nekoliko minuta, makar ono osnovno. I naravno, ne traži mnogo pisanja. Unošenje jedne baze staje u jednu liniju koda.

Osim što je brz, Sqoop je jako fleksibilan, pa ako ne želite da unesete celu bazu, možete da izaberete koja tabela vam treba, a njen naziv ne morate da znate, jer možete da izlistate tabele. Jedna stvar koju sam zaboravio da napomenem – potrebno je da imate instaliran JDBC kako biste mogli da se konektujete na server na kome je baza koju želite da unesete u HDFS. Morate da znate i nalog željene baze, koji ima potrebne dozvole za rad sa bazom. Takođe morate da podesite bazu, odnosno da omogućite TCP/IP protokol.How Sqoop Work

Ako želite da testirate Sqoop, predažem zvaničnu dokumentaciju na Apache Sqoop sajtu. Jedino na šta treba da obratite pažnju jeste verzija. Na sajtu imate dokumentaciju za Sqoop 1 i Sqoop 2, ako testirate predlažem Sqoop 1 koji ima bogatiju dokumentaciju. Iskren da budem, smatram da nema velike razlike. Glavna razlika je komandna linija, odnosno u Sqoop-u 2 imamo klijenta koji preko komandne linije komunicira sa Sqoop serverom, koji sada koristi REST interfejs. Još nisam testirao dvojku, ali sa jedinicom možete da odradite sve što vam je potrebno.

Kada i kako koristiti Sqoop?

Neću da ponavljam i pišem čemu služi Sqoop, nego želim da napišem nekoliko slučajeva korišćenja. Ako ste radili neku analizu koristeći Hadoop, odnosno Map Reduce ili sada popularniji YARN, dobili ste neke rezultate. E šta sada? Pisao sam o vizuelizaciji podataka. Zamislite da alat koji koristite za vizuelizaciju nema nikakav konektor sa Hadoop-om, a podaci moraju da budu u nekoj bazi. Onda nastupa Sqoop. Podatke koje izvezete iz Hadoop-a pomoću Sqoop-a su struktuirani. Rešili ste veliki problem na ovaj način. Isto tako, često se Hadoop klaster povezuje sa ERP sistemima koji koriste neku relacionu bazu i opet primene Sqoop-a.

Ovo su bili primeri za transfer podataka van Hadoop-a. Kada je dobro da koristite Sqoop za transfer podataka unutar Hadoop-a? Ako imate bazu koja je veličine da tradicionalni alati ne mogu da izađu na kraj sa njom, onda koristite Sqoop. Ono što  je još interesantno – zamislite da sakupljate neke senzorske podatke i u log-u imate koordinate. Možete da prilikom analize te brojeve pretvarate u ime lokacije, ali ako imate tabelu koja opisuje koordinate i ime mesta. Jednostavno unesite tabelu u Sqoop, ukrstite podatke i sa lakoćom dobijate čitljive rezultate. Mislim da je dobro koristiti relacione baze sa Hadoop-om, ako imate neke podatke koji se stalno ponavljaju. Možda je bolje reći da ovakve tabele koristite kao šifarnike, ne zauzimaju puno mesta, lako unesete u Hadoop i lako iskoristite sa nekim nestruktuiranim podacima. Pošto najviše radim sa senzorskim podacima, u dogovoru sa kolegom koji radi na senzorima i načinu upisa podataka, koristimo i relacionu bazu, odnosno tabele. Na ovaj način izbegavamo da upisujemo stringove u log fajl. Npr. napravimo tabelu koja izgleda ovako:

Naziv Šifra
Temperatura 1
Vlažnost vazduha 2

Onda log fajl izgleda ovako: 1 26.5 2 33 i tako redom. U Hadoop unesemo i tabelu i logove i pomoću HIVE-a to obradimo. Uvek je lakše raditi samo sa brojevima nego kada se tu upetljaju i stringovi. Nama je definitivno od pomoći i dobijamo na efikasnosti. Primera ima puno, ali je ovo sasvim dovoljno za upoznavanje sa ovim alatom.

Ovim tekstom završavam priču o tome kako uneti podatke u Hadoop klaster, bar u narednom periodu. Sledeći tekst je o tome zašto sam izabrao baš Hortonworks i njihovu HDP platformu.

Želim da se zahvalim svima koji čitaju moj blog, jer kada sam počinjao, nisam ni sanjao da ću imati ovoliko čitalaca. Nadam se da uživate u hadupovanju.

 

Apache Flume

U prethodnom tekstu sam pisao o tome kako uneti podatke u Hadoop klaster, odnosno u HDFS. Nastavljamo tu priču, konkretno u ovom tekstu ću pažnju posvetiti Apache Flume-u. Opisaću alat, ali i dati primere koda koje sam testirao i koristio.

Šta je Flume?

Apache Flume je distribuiran i izuzetno pouzdan servis za sakupljanje, agregaciju i transport velikih količina podataka. Prvenstveno je osmišljen za prenos podataka, ali sa evolucijom Hadoop ekosistema postaje odličan servis za tzv. streaming podatke. Ima jednostavnu arhitekturu, jako je otporan na gubitke podataka i ima mogućnost brzog oporavka. Može se reći da su tri najbitnija dela Flume-a source (izvor), channel (kanal) i sink (odredište). Najlakše je opisati ovaj alat primerom iz realnog sveta. Zamislite da imate ogromnu šumu na vrhu planine i da je vaš posao da je posečete i transportujete stabla do grada u podnožiju. Kako to uraditi? Uz pomoć prirode. Tu je veoma brza planinska reka koja se supušta do grada. Uzmete stabla, stavite u vodu i bez muke su stigla do grada. Siguran sam da ste viđali na televiziji, a možda i uživo kako ovo izgleda i koliko se stabala prenese brzo i bez velike muke. Analogno tome, u Big Data svetu imate neke podatke, odnosno stabla, šuma je izvor stabala, a izvor vaših podataka može biti neka društvena mreža, milion senzora ili log fajl nekog jako posećenog sajta. Naravno, da ne zaboravimo grad gde se obrađuju stabla ili u našem digitalnom slučaju HDFS.

Kao što vidite princip je jednostavan, a verujte mi, lako je napisati i flume skriptu za ovo. Uz zvaničnu dokumentaciju i razumevanje vašeg sistema trebaće vam onoliko koliko brzo čitate i kucate. Možda preterujem, ali najiskrenije osnovu je lako savladati.

Gde se koristi Flume?

Flume se ne koristi za prenos relacione baze podataka u HDFS, a ukoliko imate streaming podatke, Flume je odličan izbor. Koje podatke sakupljamo ovim alatom, a mogu da budu korisini pri analizi i donošenju odluka? Ako ste čuli za Twitter streaming, onda možete da sakupljate podatke sa ove društvene mreže. Ako imate veliku količinu log podataka, takođe je najbolje koristiti Flume. Probao sam da sakupljam podatke sa Twitter-a i to radi savršeno, mada moram priznati da se još nisam u potpunosti posvetio ovom izvoru podataka. Podatke sa Raspberry-a sam više testirao. Upisivanje senzorskih podataka (temperatura, vlažnost vazduha…) kao log vam daje mogućnost da ih veoma brzo i pouzdano prebacite u HDFS. Ne bih dužio priču na tu temu, jer sam već pisao tekst o tom projektu ovde. Namera mi je da malo detaljnije opišem Flume.

Pre nego što objasnim tri osnovna dela ovog alata, moram da uvedem još tri:

Agent  – Java virtuelna mašina koja sadrži kolekciju izvora, kanala i odredišta.

Event – Može se reći jedinica podataka koji se transportuje, npr. jedan log.

Client – proizvodi Event koji šalje izvoru.

Kreiranje parametara

agent1.sources = izvor
agent1.sinks = do
agent1.channels = kanal

Cilj je da se nekom agentu doda kanal koji smo definisali, praktično se ovde definišu parametri. Moguće je imati više agenata  i  isto tako jednom agentu je moguće dodati više parametara.

Channel

agent1.channels.kanal.type = memory
agent1.channels.kanal.capacity = 10000
agent1.channels.kanal.transactionCapacity = 10000

Kao što možete da vidite, nekom agentu se dodaje kanal koji smo prethodno kreirali u koraku iznad. Osnovno polje koje je potrebno definisati za kanal je tip (type). Tip kanala može biti: memory, jdbc (samo za DERBY), file, custom… Izbor zavisi od situacije i ako imate dovoljno memorije predlažem ovaj tip. Pored osnovnog polja, možete definisati capacity, odnosno broj Eventa koji se skladište u kanalu. TransactionCapacity je maksimalna broj Event-a po transakciji.

Izvor

agent1.sources.izvor.type = exec
agent1.sources.izvor.shell = /bin/bash -c
agent1.sources.izvor.command = sshpass -p "Pass" ssh -t root@hostname "tail -F  path_to_log_file"

Ovo je primer gde je izvor server koji sadrži log fajl i osnovnim poznavanjem Linux komandi možete da napišete izvor u slučaju kada je type = exec. Postoji još dosta tipova izvora koje je bespotrebno pominjati ovde pored odlične dokumentacije na zvaničnom sajtu. Čisto da napomenem da postoji i tip Twitter, a bitno je znati da možete i sami da pišete tipove u Java programskom jeziku.

Odredište

agent1.sinks.do.type = hdfs
agent1.sinks.do.hdfs.fileType = DataStream
agent1.sinks.do.hdfs.path = hdfs_path
agent1.sinks.do.hdfs.filePrefix = izvor
agent1.sinks.do.hdfs.fileSuffix = .log

Odredište je nešto što ćete često i kopirati, jer je najverovatnije da je to HDFS, mada pored njega Flume podržava i HBase, a podržano je još nekoliko tipova koje nisam još uvek testirao. Ovde posebno treba obratiti pažnju na količinu podataka koju će HDFS primiti i sačuvati. Ako bi Flume sve Event-ove čuvao u jedan fajl, onda ne biste mogli da pristupite tom fajlu dokle god stižu podaci, a ako bi u jednom fajlu bilo premalo Event-ova, onda biste imali milione sitnih fajlova i to će najverovatnije prepuniti memoriju Name Node-a, znam iz iskustva.

U principu, Flume pre nego što upiše podatke u HDFS pravi privremeni fajl, dok se ne napuni definisanom količinom Event-ova. E tu je bitno naći optimalno rešenje za vaš sistem. U prikazanom kodu ta linija fali i nije obavezna jer postoji podrazumevana vrednost. Najbolje je detaljno proučiti dokumentaciju. Ceo kod možete naći na mom GitHub nalogu, gde se nalazi i primer za Twitter.

Linkovi za Github:

https://github.com/dare92/Flume-Sensor-Data

https://github.com/dare92/Flume-Twitter-Data

ili možete da koristite prečicu sa sidebar-a.

Poslednje što treba da uradite je da dodelite kanal izvoru i odredištu.

agent1.sources.izvor.channels = kanal
agent1.sinks.do.channel = kanal

Kao što možete da vidite, pisanje Flume skripte ili konfiguracije (nisam potpuno siguran kako bih ovo nazvao) je jako intuitivno, jedino morate da znate šta tačno želite da postignete. Najiskrenije preporučujem da pročitate zvaničnu dokumentaciju i da probate sami. Ako imate bilo kakvih pitanja, rado ću se potruditi da vam dam odgovor. Meni je baratanje ovim alatom jedna od glavnih zanimacija i nadam se da će biti još primera. Sledeći tekst je o Sqoop-u, kako bismo zaokružili celinu o tome kako da unesete podatke u Hadoop klaster. Nastavljamo da hadupujemo zajedno!

 

HBase

Kada se spomene Hadoop, često se postavi pitanje koliko je brz u izvršavanju analize nad nekim podacima. Hadoop nije brz, odnosno sam po sebi ne pruža mogućnost obrade u realnom vremenu. Moram da napomenem da kada se kaže da Hadoop nije brz, ne znači da ga ne treba koristiti, nego treba razmisliti u kom trenutku ga iskoristiti. Map Reduce poslovi mogu da traju od par minuta pa i do par nedelja u zavisnosti od količine podataka i zato ga ne treba koristiti kada su u pitanju male količine. Na primer, najkraći Map Reduce posao traje 24 sekunde. Kada je reč o analizi u realnom vremenu, jedno od rešenja tog problema je Apache HBase.

Šta je HBase?

HBase je nerelaciona (NoSQL), distribuirana baza podataka napisana u programskom jeziku Java. Nastala je na osnovu Google-ove BigTable. Ova baza podataka je predviđena da radi na Hadoop-u, tačnije na HDFS-u. HBase je column oriented baza podataka i jako je otporna na otkazivanja. Jedna od najbitnijih osobina je brz pristup podacima koji su raštrkani, što je od velike pomoći ako imate nekoliko terabajta podataka, odnosno nekoliko milijardi redova, a tražite npr. 10 najvećih vrednosti od cele tabele. HBase nudi i transakcione mogućnosti korisnicima, moguće je da se podaci ažuriraju, dodaju ili obrišu. Naravno, nije potpuna zamena za tradicionalne transakcione baze podataka.

Kada se koristi HBase?

Ako vam je potrebna analiza velikih količina podataka (Big Data) u realnom vremenu onda je HBase izbor za vas. Jedna od stvari koju je bitno napomenuti je da je HBase odličan kada su u pitanju baš velike tabele. Inicijalno je napravljen da podrži tabele od nekoliko milijardi redova i nekoliko miliona kolona, što bi kao i u slučaju Hadoopa značilo da HBase ne treba koristiti za male tabele, za to postoje mnogo bolja rešenja koja će posao uraditi možda i brže. Na primer, Facebook koristi HBase od 2010. godine za analizu poruka. Zamislite samo koliko je to podataka. Isto tako, odlično je koristiti ovu bazu i za analizu log podataka. U principu ako treba da skenirate ogromne dvodimenzionalne tabele. HBase je jako integrisan sa Hadoop-om, tako da ako imate potrebe za Hadoop-om velika je vrovatnoća da ćete koristiti i HBase, za razliku od nekih drugih baza. Često se upoređuje i sa drugim bazama podataka kao što su MongoDB, Cassandra… Iskreno mislim da je jedino potrebno upoređivanje ovih baza radi odluke gde koju iskoristiti. Danas često srećem neke modele u kojima su uključeni Hadoop i MongoDB iz istog razloga kao što se HBase kombinuje sa Hadoop-om. Cilj je naći najbolje rešenje za datu situaciju, a ne reći HBase je bolj ili MongoDB je bolji. Testirao sam rad HBase-a i moram priznati da mi deluje jako intuitivno i brzo možete da “uđete u štos”. Problem na koji sam naišao je da nisam imao dovoljno podataka, tako da se sve završilo na testiranju i nadam se da ću u skorijoj budućnosti imati šansu da ga testiram na velikim tabelama, do tad učim njegovu filozofiju i sintaksu.

Prednosti?

  • Fleksibilni model podataka
  • Dobar Java API
  • Obrada u realnom vremenu
  • Moguće je pratiti stanje baze preko Ambari-ja ili Ganglia dodatka

Ovu su neke prednosti koje sam lično uočio, naravno ima ih još. Moram da dodam još jednu karakteristiku HBase-a, tabele ove baze mogu da služe kao ulaz ili kao izlaz za Map Reduce poslove, što može da bude izuzetno zgodno i primenljivo.

Ako želite da probate HBase, to možete da uradite uz pomoć Hortonworks-ovog Sandboxa. Odmah da napomenem da za to treba da imate malo jaču konfiguraciju, tačnije 4GB RAM-a neće biti dovoljno. Ako imate mogućnost da instalirate HBase na nekoliko mašina, primetićete koliko prati Hadoop, odnosno arhitektura je jako slična HDFS-u. Neka paralela bi bila NameNode-DataNode, a kod HBase-a Master server-Region server.

Voleo bih da mogu da pišem više o ovoj bazi podataka, ali trenutno, kao što sam i napomenuo, nisam mogao puno da je testiram, tako da nastavak ostavljam za neki sledeći tekst. Nadam se da sam napisao dovoljno za upoznavanje sa ovom tehnologijom. Narednih par tekstova biće o tome kako da dopremite podatke u Hadoop uz pomoć Flume-a i Sqoop-a, biće i primera Flume i Sqoop koda, da vidite kako to u praksi izgleda. Nastavimo da hadupujemo zajedno kao i do sada!