KDB+ baza podataka: od finansija do Formule 1

KDB+, proizvod kompanije KX je u uskim krugovima nadaleko poznata, izuzetno brza, stupasta baza podataka dizajnirana za pohranjivanje vremenskih serija i analitičkih proračuna na temelju njih. U početku je bio (i jeste) veoma popularan u finansijskoj industriji - koriste ga svih 10 najboljih investicionih banaka i mnogi poznati hedž fondovi, berze i druge organizacije. Nedavno je KX odlučio proširiti svoju bazu kupaca i sada ponuditi rješenja u drugim oblastima u kojima postoji velika količina podataka, organizovanih po vremenu ili na drugi način - telekom, bioinformatika, proizvodnja itd. Također su postali partner Aston Martin Red Bull Racing tima u Formuli 1, gdje pomažu u prikupljanju i obradi podataka sa senzora automobila i analiziraju testove u aerotunelu. U ovom članku želim da vam kažem koje karakteristike KDB+ ga čine vrhunskim, zašto su kompanije spremne da potroše mnogo novca na njega, i na kraju, zašto to zapravo nije baza podataka.
 
KDB+ baza podataka: od finansija do Formule 1
 
U ovom članku pokušat ću vam općenito reći šta je KDB+, koje mogućnosti i ograničenja ima i koje su njegove prednosti za kompanije koje žele da obrađuju velike količine podataka. Neću ulaziti u detalje implementacije KDB+ ili detalje njegovog programskog jezika Q. Obje ove teme su vrlo široke i zaslužuju posebne članke. Mnogo informacija o ovim temama može se naći na code.kx.com, uključujući knjigu o Q - Q za smrtnike (pogledajte link ispod).

Neki termini

  • Baza podataka u memoriji. Baza podataka koja pohranjuje podatke u RAM za brži pristup. Prednosti ovakve baze podataka su jasne, ali nedostaci su mogućnost gubitka podataka i potreba da se na serveru ima dosta memorije.
  • Kolumna baza podataka. Baza podataka u kojoj se podaci pohranjuju stupac po kolonu, a ne zapis po zapis. Glavna prednost takve baze podataka je što se podaci iz jedne kolone pohranjuju zajedno na disku iu memoriji, što značajno ubrzava pristup njoj. Nema potrebe za učitavanjem kolona koje se ne koriste u upitu. Glavni nedostatak je što je teško mijenjati i brisati zapise.
  • Vremenske serije. Podaci sa stupcem datuma ili vremena. Obično je vremenski poredak važan za takve podatke tako da možete lako odrediti koji zapis prethodi ili slijedi tekućem, ili primijeniti funkcije čiji rezultati ovise o redoslijedu zapisa. Klasične baze podataka izgrađene su na potpuno drugačijem principu – predstavljaju zbirku zapisa kao skup, pri čemu redosled zapisa u principu nije definisan.
  • Vector. U kontekstu KDB+, ovo je lista elemenata istog atomskog tipa, na primjer, brojevi. Drugim riječima, niz elemenata. Nizovi, za razliku od lista, mogu se skladištiti kompaktno i obraditi pomoću instrukcija vektorskog procesora.

 

Istorijski podaci

KX je 1993. godine osnovao Arthur Whitney, koji je prethodno radio u Morgan Stanley Bank na A+ jeziku, nasljedniku APL-a - vrlo originalnog i svojevremeno popularnog jezika u svijetu finansija. Naravno, u KX-u, Arthur je nastavio u istom duhu i stvorio vektorsko-funkcionalni jezik K, vođen idejama radikalnog minimalizma. K programi izgledaju kao zbrka interpunkcije i specijalnih znakova, značenje znakova i funkcija ovisi o kontekstu, a svaka operacija nosi mnogo više značenja nego u konvencionalnim programskim jezicima. Zbog toga, K program zauzima minimalan prostor—nekoliko redova može zamijeniti stranice teksta u opširnom jeziku kao što je Java—i super je koncentrirana implementacija algoritma.
 
Funkcija u K koja implementira većinu generatora LL1 parsera prema datoj gramatici:

1. pp:{q:{(x;p3(),y)};r:$[-11=@x;$x;11=@x;q[`N;$*x];10=abs@@x;q[`N;x]  
2.   ($)~*x;(`P;p3 x 1);(1=#x)&11=@*x;pp[{(1#x;$[2=#x;;,:]1_x)}@*x]  
3.      (?)~*x;(`Q;pp[x 1]);(*)~*x;(`M;pp[x 1]);(+)~*x;(`MP;pp[x 1]);(!)~*x;(`Y;p3 x 1)  
4.      (2=#x)&(@x 1)in 100 101 107 7 -7h;($[(@x 1)in 100 101 107h;`Ff;`Fi];p3 x 1;pp[*x])  
5.      (|)~*x;`S,(pp'1_x);2=#x;`C,{@[@[x;-1+#x;{x,")"}];0;"(",]}({$[".s.C"~4#x;6_-2_x;x]}'pp'x);'`pp];  
6.   $[@r;r;($[1<#r;".s.";""],$*r),$[1<#r;"[",(";"/:1_r),"]";""]]}  

 Arthur je ovu filozofiju ekstremne efikasnosti utjelovio sa minimalnim pokretima tijela u KDB+, koji se pojavio 2003. (mislim da je sada jasno odakle dolazi slovo K u imenu) i nije ništa drugo do tumač četvrte verzije K Dodata je više prilagođena verzija na K K pod nazivom Q. Q je takođe dodao podršku za određeni dijalekt SQL-a - QSQL, i interpreter - podršku za tabele kao sistemski tip podataka, alate za rad sa tabelama u memoriji i na disku itd.
 
Dakle, iz perspektive korisnika, KDB+ je jednostavno Q jezika interpreter sa podrškom za tabele i izraze u stilu LINQ u stilu SQL-a iz C#. Ovo je najvažnija razlika između KDB+ i drugih baza podataka i njena glavna konkurentska prednost, koja se često zanemaruje. Ovo nije baza podataka + onemogućeni pomoćni jezik, već punopravni moćni programski jezik + ugrađena podrška za funkcije baze podataka. Ova razlika će igrati odlučujuću ulogu u navođenju svih prednosti KDB+. Na primjer…
 

veličina

Prema modernim standardima, KDB+ je jednostavno mikroskopske veličine. To je bukvalno jedna izvršna datoteka od sub-megabajta i jedna mala tekstualna datoteka sa nekim sistemskim funkcijama. U stvarnosti - manje od jednog megabajta, a za ovaj program kompanije plaćaju desetine hiljada dolara godišnje za jedan procesor na serveru.

  • Ova veličina omogućava KDB+ da se osjeća odlično na bilo kojem hardveru - od Pi mikroračunara do servera sa terabajtima memorije. Ovo ni na koji način ne utiče na funkcionalnost; štaviše, Q se pokreće trenutno, što mu omogućava da se, između ostalog, koristi kao skript jezik.
  • Na ovoj veličini, Q interpreter se u potpunosti uklapa u keš procesora, što ubrzava izvršavanje programa.
  • Sa ovom veličinom izvršne datoteke, Q proces zauzima zanemariv prostor u memoriji; možete ih pokrenuti na stotine. Štaviše, ako je potrebno, Q može raditi sa desetinama ili stotinama gigabajta memorije unutar jednog procesa.

Svestranost

Q je odličan za širok spektar aplikacija. Proces Q može djelovati kao historijska baza podataka i omogućiti brz pristup terabajtima informacija. Na primjer, imamo desetine povijesnih baza podataka, u nekima od kojih jedan nekomprimirani dan podataka zauzima više od 100 gigabajta. Međutim, pod razumnim ograničenjima, upit bazi podataka će biti završen za desetine do stotine milisekundi. Općenito, imamo univerzalno vremensko ograničenje za zahtjeve korisnika - 30 sekundi - i to radi vrlo rijetko.
 
Q bi isto tako lako mogao biti baza podataka u memoriji. Novi podaci se dodaju u tablice u memoriji tako brzo da su zahtjevi korisnika ograničavajući faktor. Podaci u tabelama se pohranjuju u kolone, što znači da će svaka operacija na koloni koristiti keš procesora punim kapacitetom. Pored ovoga, KX je pokušao da implementira sve osnovne operacije kao što je aritmetika kroz vektorske instrukcije procesora, maksimizirajući njihovu brzinu. Q također može obavljati zadatke koji nisu tipični za baze podataka - na primjer, obraditi streaming podataka i izračunati u "realnom vremenu" (sa kašnjenjem od nekoliko desetina milisekundi do nekoliko sekundi u zavisnosti od zadatka) različite funkcije agregacije za finansijske instrumente za različito vrijeme intervalima ili izgraditi model uticaja savršenih transakcija na tržište i izvršiti njegovo profilisanje gotovo odmah po njegovom završetku. Kod ovakvih zadataka najčešće glavno vremensko kašnjenje nije Q, već potreba za sinhronizacijom podataka iz različitih izvora. Velika brzina se postiže zahvaljujući činjenici da su podaci i funkcije koje ih obrađuju u jednom procesu, a obrada se svodi na izvršavanje više QSQL izraza i spajanja, koji se ne interpretiraju, već se izvršavaju binarnim kodom.
 
Konačno, možete napisati bilo koji servisni proces u Q. Na primjer, Gateway procesi koji automatski distribuiraju korisničke zahtjeve potrebnim bazama podataka i serverima. Programer ima potpunu slobodu da implementira bilo koji algoritam za balansiranje, određivanje prioriteta, toleranciju grešaka, prava pristupa, kvote i u osnovi sve što mu srce poželi. Glavni problem ovdje je što ćete sve ovo morati sami implementirati.
 
Kao primjer navešću koje vrste procesa imamo. Svi oni se aktivno koriste i rade zajedno, kombinujući desetine različitih baza podataka u jednu, obrađujući podatke iz više izvora i služeći stotinama korisnika i aplikacija.

  • Konektori (feedhandler) za izvore podataka. Ovi procesi obično koriste eksterne biblioteke koje se učitavaju u Q. C interfejs u Q je izuzetno jednostavan i omogućava vam da lako kreirate proxy funkcije za bilo koju C/C++ biblioteku. Q je dovoljno brz da istovremeno obrađuje, na primjer, poplavu FIX poruka sa svih evropskih berzi.
  • Distributeri podataka (tickerplant), koji služe kao posredna karika između konektora i potrošača. U isto vrijeme, oni zapisuju dolazne podatke u poseban binarni dnevnik, pružajući robustnost potrošačima protiv gubitaka veze ili ponovnog pokretanja.
  • Baza podataka u memoriji (rdb). Ove baze podataka pružaju najbrži mogući pristup sirovim, svježim podacima pohranjivanjem u memoriju. Obično akumuliraju podatke u tabelama tokom dana i resetuju ih noću.
  • Trajna baza podataka (pdb). Ove baze podataka osiguravaju da se podaci za današnje vrijeme pohranjuju u historijsku bazu podataka. Po pravilu, za razliku od rdb-a, oni ne pohranjuju podatke u memoriju, već koriste posebnu keš memoriju na disku tokom dana i kopiraju podatke u ponoć u historijsku bazu podataka.
  • Istorijske baze podataka (hdb). Ove baze podataka omogućavaju pristup podacima za prethodne dane, mjesece i godine. Njihova veličina (u danima) ograničena je samo veličinom tvrdih diskova. Podaci se mogu nalaziti bilo gdje, posebno na različitim diskovima kako bi se ubrzao pristup. Moguće je komprimirati podatke koristeći nekoliko algoritama za odabir. Struktura baze podataka je dobro dokumentovana i jednostavna, podaci se pohranjuju kolonu po kolonu u regularne datoteke, tako da se mogu obraditi, uključujući i pomoću operativnog sistema.
  • Baze podataka sa agregiranim informacijama. Oni pohranjuju različite agregacije, obično sa, grupisane po imenu instrumenta i vremenskom intervalu. Memorijske baze podataka ažuriraju svoje stanje sa svakom dolaznom porukom, a historijske baze podataka pohranjuju unaprijed izračunate podatke kako bi se ubrzao pristup historijskim podacima.
  • Na kraju, gateway procesiservisiranje aplikacija i korisnika. Q vam omogućava da implementirate potpuno asinhronu obradu dolaznih poruka, distribuciju između baza podataka, provjeru prava pristupa itd. Imajte na umu da poruke nisu ograničene i najčešće nisu SQL izrazi, kao što je slučaj u drugim bazama podataka. Najčešće se SQL izraz skriva u posebnoj funkciji i konstruiše se na osnovu parametara koje zahteva korisnik - vreme se konvertuje, filtrira, podaci se normalizuju (na primer, cena akcija se izjednačava ako su isplaćene dividende) itd.

Tipična arhitektura za jedan tip podataka:

KDB+ baza podataka: od finansija do Formule 1

Brzina

Iako je Q interpretirani jezik, on je i vektorski jezik. To znači da mnoge ugrađene funkcije, posebno one aritmetičke, uzimaju argumente bilo kojeg oblika - brojeve, vektori, matrice, liste - i od programera se očekuje da implementira program kao niz operacija. U takvom jeziku, ako dodate dva vektora od milion elemenata, više nije važno da se jezik interpretira; dodavanje će biti izvedeno super-optimiziranom binarnom funkcijom. Budući da se najveći dio vremena u Q programima troši na operacije s tabelama koje koriste ove osnovne vektorizirane funkcije, izlaz je vrlo pristojna brzina rada, što nam omogućava da obradimo ogromnu količinu podataka čak i u jednom procesu. Ovo je slično matematičkim bibliotekama u Pythonu - iako je sam Python veoma spor jezik, ima mnogo odličnih biblioteka poput numpyja koje vam omogućavaju da obrađujete numeričke podatke brzinom kompajliranog jezika (usput, numpy je ideološki blizak Q ).
 
Pored toga, KX je veoma pažljivo pristupio dizajniranju tabela i optimizaciji rada sa njima. Prvo, podržano je nekoliko tipova indeksa, koji su podržani ugrađenim funkcijama i mogu se primeniti ne samo na kolone tabele, već i na sve vektore - grupisanje, sortiranje, atribut jedinstvenosti i posebno grupisanje za istorijske baze podataka. Indeks se jednostavno primjenjuje i automatski se prilagođava prilikom dodavanja elemenata u kolonu/vektor. Indeksi se jednako uspješno mogu primijeniti na stupce tablice kako u memoriji tako i na disku. Kada se izvršava QSQL upit, indeksi se automatski koriste ako je moguće. Drugo, rad sa istorijskim podacima se obavlja kroz mehanizam za prikaz OS fajlova (memory map). Velike tabele se nikada ne učitavaju u memoriju; umesto toga, potrebne kolone se mapiraju direktno u memoriju i zapravo se učitava samo onaj deo njih (tu pomažu i indeksi) koji su potrebni. Programeru nije bitno da li su podaci u memoriji ili ne; mehanizam za rad sa mmap potpuno je skriven u dubinama Q.
 
KDB+ nije relaciona baza podataka; tabele mogu sadržati proizvoljne podatke, dok se redosled redova u tabeli ne menja kada se dodaju novi elementi i može i treba da se koristi prilikom pisanja upita. Ova funkcija je hitno potrebna za rad sa vremenskim serijama (podaci sa centrala, telemetrija, evidencija događaja), jer ako su podaci razvrstani po vremenu, tada korisnik ne mora koristiti nikakve SQL trikove da pronađe prvi ili zadnji red ili N redove u tabeli, odredite koji red prati N-ti red, itd. Spajanje tablica je još više pojednostavljeno, na primjer, pronalaženje posljednje ponude za 16000 VOD.L (Vodafone) transakcija u tabeli od 500 miliona elemenata traje oko sekunde na disku i desetine milisekundi u memoriji.
 
Primjer vremenskog spajanja - tabela citata je mapirana u memoriju, tako da nema potrebe specificirati VOD.L gdje se implicitno koristi indeks na koloni sym i činjenica da su podaci sortirani po vremenu. Gotovo svi spojevi u Q su regularne funkcije, a ne dio izraza za odabir:

1. aj[`sym`time;select from trade where date=2019.03.26, sym=`VOD.L;select from quote where date=2019.03.26]  

Konačno, vrijedno je napomenuti da su inženjeri u KX-u, počevši od samog Arthura Whitneya, zaista opsjednuti efikasnošću i trude se mnogo da izvuku maksimum iz standardnih karakteristika Q-a i optimiziraju najčešće obrasce korištenja.
 

Rezultat

KDB+ je popularan među preduzećima prvenstveno zbog svoje izuzetne svestranosti – podjednako dobro služi i kao baza podataka u memoriji, kao baza podataka za skladištenje terabajta istorijskih podataka i kao platforma za analizu podataka. Zbog činjenice da se obrada podataka odvija direktno u bazi podataka, postiže se velika brzina rada i ušteda resursa. Punopravni programski jezik integriran sa funkcijama baze podataka omogućava vam da implementirate čitav niz potrebnih procesa na jednoj platformi - od primanja podataka do obrade korisničkih zahtjeva.
 

Za više informacija,

mane

Značajan nedostatak KDB+/Q je visok ulazni prag. Jezik ima čudnu sintaksu, neke funkcije su jako preopterećene (vrijednost, na primjer, ima oko 11 slučajeva upotrebe). Ono što je najvažnije, zahtijeva radikalno drugačiji pristup pisanju programa. U vektorskom jeziku, uvijek morate razmišljati u smislu transformacija niza, implementirati sve petlje kroz nekoliko varijanti funkcija mapiranja/reduciranja (koje se u Q nazivaju prilozima) i nikada ne pokušavati uštedjeti novac zamjenom vektorskih operacija atomskim. Na primjer, da biste pronašli indeks N-tog pojavljivanja elementa u nizu, trebali biste napisati:

1. (where element=vector)[N]  

iako ovo izgleda užasno neefikasno po C/Java standardima (= kreira logički vektor, gdje vraća prave indekse elemenata u njemu). Ali ova notacija čini značenje izraza jasnijim i koristite brze vektorske operacije umjesto sporih atomskih. Konceptualna razlika između vektorskog jezika i drugih je uporediva s razlikom između imperativnog i funkcionalnog pristupa programiranju, i za to morate biti spremni.
 
Neki korisnici su također nezadovoljni QSQL-om. Poenta je da izgleda samo kao pravi SQL. U stvarnosti, to je samo tumač izraza sličnih SQL-u koji ne podržava optimizaciju upita. Korisnik mora sam pisati optimalne upite i to u Q, za šta mnogi nisu spremni. S druge strane, naravno, uvijek možete sami napisati optimalni upit, umjesto da se oslanjate na optimizator crne kutije.
 
Kao plus, knjiga o Q - Q For Mortals je dostupna besplatno na adresi sajt kompanije, tu je i dosta drugih korisnih materijala prikupljenih.
 
Još jedan veliki nedostatak je cijena licence. To je desetine hiljada dolara godišnje po CPU-u. Samo velike kompanije mogu sebi priuštiti takve troškove. Nedavno je KX svoju politiku licenciranja učinio fleksibilnijom i pruža mogućnost plaćanja samo za vrijeme korištenja ili iznajmljivanja KDB+ u Google i Amazon oblacima. KX također nudi za preuzimanje besplatna verzija za nekomercijalne svrhe (32-bitna verzija ili 64-bitna na zahtjev).
 

Takmičari

Postoji dosta specijalizovanih baza podataka izgrađenih na sličnim principima - stupastih, u memoriji, fokusiranih na veoma velike količine podataka. Problem je što se radi o specijalizovanim bazama podataka. Upečatljiv primjer je Clickhouse. Ova baza podataka ima vrlo sličan princip kao KDB+ za pohranjivanje podataka na disk i izgradnju indeksa; neke upite izvodi brže od KDB+, iako ne značajno. Ali čak i kao baza podataka, Clickhouse je specijalizovaniji od KDB+ - web analitika naspram proizvoljnih vremenskih serija (ova razlika je vrlo važna - zbog nje, na primjer, u Clickhouse-u nije moguće koristiti redoslijed zapisa). Ali, što je najvažnije, Clickhouse nema svestranost KDB+, jezika koji bi omogućio obradu podataka direktno u bazi podataka, umjesto da ih prvo učitava u zasebnu aplikaciju, pravljenje proizvoljnih SQL izraza, primjenu proizvoljnih funkcija u upitu, kreiranje procesa nije vezano za izvršavanje historijskih funkcija baze podataka. Stoga je teško porediti KDB+ sa drugim bazama podataka, možda su bolje u određenim slučajevima upotrebe ili jednostavno bolje kada su u pitanju klasični zadaci baze podataka, ali ne znam za drugi jednako efikasan i svestran alat za obradu privremenih podataka.
 

Python integracija

Da bi KDB+ učinio lakšim za upotrebu za ljude koji nisu upoznati sa tehnologijom, KX je kreirao biblioteke za čvrstu integraciju sa Pythonom u okviru jednog procesa. Možete ili pozvati bilo koju Python funkciju iz Q, ili obrnuto - pozvati bilo koju Q funkciju iz Pythona (posebno, QSQL izraze). Biblioteke pretvaraju, ako je potrebno (ne uvijek radi efikasnosti), podatke iz formata jednog jezika u format drugog. Kao rezultat toga, Q i Python žive u tako bliskoj simbiozi da su granice između njih zamagljene. Kao rezultat toga, programer, s jedne strane, ima potpun pristup brojnim korisnim Python bibliotekama, s druge strane dobija brzu bazu za rad sa velikim podacima integrisanim u Python, što je posebno korisno za one koji se bave mašinskim učenjem. ili modeliranje.
 
Rad sa Q u Pythonu:

1. >>> q()  
2.q)trade:([]date:();sym:();qty:())  
3. q)  
4. >>> q.insert('trade', (date(2006,10,6), 'IBM', 200))  
5. k(',0')  
6. >>> q.insert('trade', (date(2006,10,6), 'MSFT', 100))  
7. k(',1')  

reference

Sajt kompanije - https://kx.com/
Web stranica za programere - https://code.kx.com/v2/
Knjiga Q za smrtnike (na engleskom) - https://code.kx.com/q4m3/
Članci o KDB+/Q aplikacijama od kx zaposlenih - https://code.kx.com/v2/wp/

izvor: www.habr.com

Dodajte komentar