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.
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:
- hive.support.concurrency – true
- hive.enforce.bucketing – true
- hive.exec.dynamic.partition.mode – nonstrict
- hive.txn.manager – org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
- hive.compactor.initiator.on – true (za tačno jednu instancu Thrift Metastore servisa)
- hive.compactor.worker.threads – pozitivan broj na bar jednoj instanci Thrift Metastore servisa.
Potrebna podešavanja za izvršavanje naredbi Insert, Update i Delete su:
- hive.support.concurrency – true
- hive.enforce.bucketing – true
- hive.exec.dynamic.partition.mode – nonstrict
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.