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!