KDB+ baza podataka: od financija do Formule 1

KDB+, proizvod tvrtke KX je u užim krugovima poznata, izuzetno brza, stupčasta baza podataka namijenjena pohranjivanju vremenskih serija i analitičkih izračuna temeljenih na njima. U početku je bio (i jest) vrlo popularan u financijskoj industriji - svih 10 najboljih investicijskih banaka i mnogi poznati hedge fondovi, burze i druge organizacije koriste ga. Nedavno je KX odlučio proširiti svoju bazu korisnika i sada nudi rješenja u drugim područjima gdje postoji velika količina podataka, vremenski ili drugačije organiziranih - telekom, bioinformatika, proizvodnja itd. Postali su i partneri Aston Martin Red Bull Racing tima u Formuli 1, gdje pomažu u prikupljanju i obradi podataka sa senzora automobila i analizi testova u zračnom tunelu. U ovom članku želim vam reći koje ga značajke KDB+ čine izvrsnim, zašto su tvrtke spremne potrošiti puno novca na njega i konačno, zašto to zapravo nije baza podataka.
 
KDB+ baza podataka: od financija do Formule 1
 
U ovom članku pokušat ću vam općenito reći što je KDB+, koje mogućnosti i ograničenja ima te koje su njegove prednosti za tvrtke koje žele obraditi velike količine podataka. Neću ulaziti u detalje implementacije KDB+ ili pojedinosti njegovog programskog jezika Q. Obje ove teme su vrlo široke i zaslužuju zasebne članke. Puno informacija o ovim temama može se pronaći na code.kx.com, uključujući knjigu o Q - Q za smrtnike (pogledajte poveznicu ispod).

Neki pojmovi

  • Baza podataka u memoriji. Baza podataka koja pohranjuje podatke u RAM za brži pristup. Prednosti takve baze podataka su jasne, ali nedostaci su mogućnost gubitka podataka i potreba za velikom količinom memorije na poslužitelju.
  • Baza podataka u stupcima. Baza podataka u kojoj se podaci pohranjuju stupac po stupac, a ne zapis po zapis. Glavna prednost takve baze podataka je što se podaci iz jednog stupca pohranjuju zajedno na disk i u memoriju, što znatno ubrzava pristup istoj. Nema potrebe učitavati stupce koji 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 trenutni, ili da primijenite 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 redoslijed zapisa u načelu nije definiran.
  • Vektor. U kontekstu KDB+, ovo je popis elemenata iste atomske vrste, na primjer, brojevi. Drugim riječima, niz elemenata. Nizovi se, za razliku od popisa, mogu kompaktno pohraniti i obrađivati ​​pomoću uputa vektorskog procesora.

 

Povijest

KX je 1993. godine osnovao Arthur Whitney, koji je prethodno radio u banci Morgan Stanley na jeziku A+, nasljedniku APL-a - vrlo originalnom i svojedobno popularnom jeziku u financijskom svijetu. Naravno, Arthur je u KX-u nastavio u istom duhu i kreirao vektorsko-funkcionalni jezik K, vodeći se idejama radikalnog minimalizma. K programi izgledaju kao zbrka interpunkcijskih znakova i posebnih znakova, značenje znakova i funkcija ovisi o kontekstu, a svaka operacija ima mnogo više značenja nego u konvencionalnim programskim jezicima. Zbog toga K program zauzima minimalan prostor—nekoliko redaka može zamijeniti stranice teksta u opširnom jeziku poput Jave—i super je koncentrirana implementacija algoritma.
 
Funkcija u K koja implementira većinu LL1 generatora parsera prema danoj 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),"]";""]]}  

 Tu filozofiju ekstremne učinkovitosti uz minimum pokreta tijela Arthur je utjelovio u KDB+ koji se pojavio 2003. godine (mislim da je sada jasno otkud slovo K u nazivu) i nije ništa više od interpretatora četvrte verzije K. Dodana je korisnička inačica povrh K K pod nazivom Q. Q je također dodao podršku za određeni dijalekt SQL-a - QSQL, i tumač - podršku za tablice kao tip podataka sustava, alate za rad s tablicama u memoriji i na disku itd.
 
Dakle, iz perspektive korisnika, KDB+ je jednostavno prevoditelj jezika Q s podrškom za tablice i izraze u LINQ stilu poput SQL-a iz C#. To je najvažnija razlika između KDB+ i drugih baza podataka i njegova glavna konkurentska prednost, koja se često zanemaruje. Ovo nije baza podataka + onemogućeni pomoćni jezik, već potpuni moćni programski jezik + ugrađena podrška za funkcije baze podataka. Ova će razlika igrati odlučujuću ulogu u popisu svih prednosti KDB+. Na primjer…
 

Veličina

Prema modernim standardima, KDB+ je jednostavno mikroskopske veličine. To je doslovno jedna izvršna datoteka veličine sub-megabajta i jedna mala tekstualna datoteka s nekim funkcijama sustava. U stvarnosti - manje od jednog megabajta, a za ovaj program tvrtke plaćaju desetke tisuća dolara godišnje za jedan procesor na poslužitelju.

  • Ova veličina omogućuje KDB+ da se osjeća izvrsno na bilo kojem hardveru - od Pi mikroračunala do poslužitelja s terabajtima memorije. To ni na koji način ne utječe na funkcionalnost, štoviše, Q se pokreće trenutno, što mu omogućuje da se, između ostalog, koristi kao skriptni jezik.
  • S ovom veličinom, Q interpreter u potpunosti staje u predmemoriju procesora, što ubrzava izvođenje programa.
  • Uz ovu veličinu izvršne datoteke, Q proces zauzima zanemarivo malo prostora u memoriji; možete ih pokrenuti na stotine. Štoviše, ako je potrebno, Q može raditi s desecima ili stotinama gigabajta memorije unutar jednog procesa.

mnogostranost

Q je izvrstan za širok raspon primjena. Proces Q može djelovati kao povijesna baza podataka i omogućiti brz pristup terabajtima informacija. Na primjer, imamo desetke povijesnih baza podataka, u nekima od kojih jedan nekomprimirani dan podataka zauzima više od 100 gigabajta. Međutim, pod razumnim ograničenjima, upit u bazu podataka bit će dovršen za desetke do stotine milisekundi. Općenito, imamo univerzalno vremensko ograničenje za korisničke zahtjeve - 30 sekundi - i ono radi vrlo rijetko.
 
Q bi jednako lako mogao biti baza podataka u memoriji. Novi podaci dodaju se u tablice u memoriji tako brzo da su zahtjevi korisnika ograničavajući faktor. Podaci u tablicama pohranjuju se u stupce, što znači da će svaka operacija na stupcu koristiti predmemoriju procesora u punom kapacitetu. Uz to, KX je pokušao implementirati sve osnovne operacije poput aritmetike 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 strujanje podataka i izračunati u "stvarnom vremenu" (s odgodom od desetaka milisekundi do nekoliko sekundi, ovisno o zadatku) različite funkcije agregacije za financijske instrumente za različito vrijeme intervalima ili izgraditi model utjecaja savršenih transakcija na tržište i izvršiti njegovo profiliranje gotovo odmah nakon završetka. U takvim zadacima najčešće glavno vremensko kašnjenje nije Q, već potreba za sinkronizacijom podataka iz različitih izvora. Velika brzina se postiže zahvaljujući tome što su podaci i funkcije koje ih obrađuju u jednom procesu, a obrada se svodi na izvršavanje nekoliko QSQL izraza i spojeva koji se ne interpretiraju, već se izvršavaju binarnim kodom.
 
Konačno, u Q možete napisati bilo koji servisni proces. Na primjer, Gateway procesi koji automatski distribuiraju korisničke zahtjeve potrebnim bazama podataka i poslužiteljima. Programer ima potpunu slobodu implementacije bilo kojeg algoritma za balansiranje, određivanje prioriteta, toleranciju na pogreške, prava pristupa, kvote i u osnovi sve ostalo što mu srce poželi. Glavni problem ovdje je što ćete sve ovo morati implementirati sami.
 
Kao primjer navest ću koje vrste procesa imamo. Sve se one aktivno koriste i rade zajedno, kombinirajući desetke različitih baza podataka u jednu, obrađujući podatke iz više izvora i opslužujući stotine korisnika i aplikacija.

  • Konektori (feedhandler) za izvore podataka. Ovi procesi obično koriste vanjske biblioteke koje se učitavaju u Q. C sučelje u Q-u iznimno je jednostavno i omogućuje vam jednostavno stvaranje proxy funkcija za bilo koju C/C++ biblioteku. Q je dovoljno brz da podnese, na primjer, obradu poplave FIX poruka sa svih europskih burzi istovremeno.
  • Distributeri podataka (tickerplant), koji služe kao posredna veza između konektora i potrošača. U isto vrijeme, oni zapisuju dolazne podatke u poseban binarni dnevnik, pružajući robusnost potrošačima protiv gubitaka veze ili ponovnog pokretanja.
  • Baza podataka u memoriji (rdb). Ove baze podataka omogućuju najbrži mogući pristup neobrađenim, svježim podacima pohranjujući ih u memoriju. Obično prikupljaju podatke u tablicama tijekom dana i poništavaju ih noću.
  • Trajna baza podataka (pdb). Ove baze podataka osiguravaju da se današnji podaci pohranjuju u povijesnu bazu podataka. U pravilu, za razliku od rdb-a, oni ne pohranjuju podatke u memoriju, već koriste poseban cache na disku tijekom dana i kopiraju podatke u ponoć u povijesnu bazu podataka.
  • Povijesne baze podataka (hdb). Ove baze podataka omogućuju 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, posebice na različitim diskovima kako bi se ubrzao pristup. Moguće je komprimirati podatke pomoću nekoliko algoritama koje možete izabrati. Struktura baze podataka je dobro dokumentirana i jednostavna, podaci se pohranjuju stupac po stupac u obične datoteke, tako da se mogu obrađivati, uključujući i pomoću operativnog sustava.
  • Baze podataka s agregiranim informacijama. Oni pohranjuju različite agregacije, obično sa, grupirane prema nazivu instrumenta i vremenskom intervalu. Baze podataka u memoriji ažuriraju svoje stanje sa svakom dolaznom porukom, a povijesne baze podataka pohranjuju unaprijed izračunate podatke kako bi se ubrzao pristup povijesnim podacima.
  • Konačno, pristupni procesiservisiranje aplikacija i korisnika. Q vam omogućuje implementaciju potpuno asinkrone obrade dolaznih poruka, njihovu distribuciju kroz baze 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 je SQL izraz skriven u posebnoj funkciji i konstruiran je na temelju parametara koje korisnik traži - vrijeme se pretvara, filtrira, podaci se normaliziraju (primjerice, izjednačava se cijena dionice ako su isplaćene dividende) itd.

Tipična arhitektura za jedan tip podataka:

KDB+ baza podataka: od financija do Formule 1

Ubrzati

Iako je Q interpretirani jezik, on je također i vektorski jezik. To znači da mnoge ugrađene funkcije, osobito aritmetičke, uzimaju argumente bilo kojeg oblika - brojeve, vektore, matrice, popise - a od programera se očekuje da implementira program kao operacije niza. U takvom jeziku, ako dodate dva vektora od milijun elemenata, više nije važno da se jezik interpretira; zbrajanje će izvršiti super-optimizirana binarna funkcija. Budući da se lavovski dio vremena u Q programima troši na operacije s tablicama koje koriste te osnovne vektorizirane funkcije, rezultat je vrlo pristojna radna brzina, što nam omogućuje obradu ogromne količine podataka čak iu jednom procesu. Ovo je slično matematičkim bibliotekama u Pythonu - iako je Python sam po sebi vrlo spor jezik, ima mnogo izvrsnih biblioteka poput numpyja koje vam omogućuju obradu numeričkih podataka brzinom kompiliranog jezika (usput, numpy je ideološki blizak Q ).
 
Osim toga, KX je vrlo pažljivo pristupio dizajniranju stolova i optimizaciji rada s njima. Prvo, podržano je nekoliko vrsta indeksa, koje podržavaju ugrađene funkcije i mogu se primijeniti ne samo na stupce tablice, već i na bilo koje vektore - grupiranje, sortiranje, atribut jedinstvenosti i posebno grupiranje za povijesne baze podataka. Indeks se jednostavno primjenjuje i automatski se prilagođava prilikom dodavanja elemenata u stupac/vektor. Indeksi se jednako uspješno mogu primijeniti na stupce tablice i u memoriji i na disku. Prilikom izvršavanja QSQL upita, indeksi se automatski koriste ako je moguće. Drugo, rad s povijesnim podacima obavlja se putem mehanizma za prikaz OS datoteka (memorijski map). Velike tablice nikada se ne učitavaju u memoriju; umjesto toga, potrebni stupci mapiraju se izravno u memoriju i stvarno se učitava samo onaj njihov dio (tu također pomažu indeksi) koji je potreban. Programeru je svejedno jesu li podaci u memoriji ili ne; mehanizam za rad s mmapom potpuno je skriven u dubinama Q-a.
 
KDB+ nije relacijska baza podataka, tablice mogu sadržavati proizvoljne podatke, dok se redoslijed redaka u tablici ne mijenja dodavanjem novih elemenata te se može i treba koristiti pri pisanju upita. Ova značajka je hitno potrebna za rad s vremenskim serijama (podaci iz centrala, telemetrija, zapisnici događaja), jer ako su podaci sortirani po vremenu, tada korisnik ne treba koristiti nikakve SQL trikove da pronađe prvi ili zadnji red ili N redaka u tablici, odrediti koji redak slijedi nakon N-tog retka itd. Spajanje tablica još je više pojednostavljeno, na primjer, pronalaženje zadnje ponude za 16000 VOD.L (Vodafone) transakcija u tablici od 500 milijuna elemenata traje otprilike jednu sekundu na disku i desetke milisekundi u memoriji.
 
Primjer vremenskog spajanja - tablica citata je preslikana u memoriju, tako da nema potrebe za navođenjem VOD.L u mjestu gdje, indeks u stupcu simbola i činjenica da su podaci poredani po vremenu implicitno se koriste. Gotovo sva spajanja u Q su regularne funkcije, a ne dio odabranog izraza:

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, doista opsjednuti učinkovitošću i da se jako trude izvući maksimum iz standardnih značajki Q-a i optimizirati najčešće obrasce korištenja.
 

Ukupan

KDB+ je popularan među poduzećima prvenstveno zbog svoje iznimne svestranosti - jednako dobro služi kao baza podataka u memoriji, kao baza za pohranjivanje terabajta povijesnih podataka i kao platforma za analizu podataka. Zbog činjenice da se obrada podataka odvija izravno u bazi podataka, postiže se velika brzina rada i ušteda resursa. Potpuni programski jezik integriran s funkcijama baze podataka omogućuje implementaciju čitavog niza potrebnih procesa na jednoj platformi - od primanja podataka do obrade korisničkih zahtjeva.
 

Za više informacija,

Ograničenja

Značajan nedostatak KDB+/Q je visok ulazni prag. Jezik ima čudnu sintaksu, neke su funkcije jako preopterećene (vrijednost, na primjer, ima oko 11 slučajeva upotrebe). Što je najvažnije, zahtijeva radikalno drugačiji pristup pisanju programa. U vektorskom jeziku uvijek morate razmišljati u terminima transformacija niza, implementirati sve petlje kroz nekoliko varijanti funkcija mapiranja/redukcije (koje se nazivaju prilozima u Q) 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 se ovo čini užasno neučinkovitim prema C/Java standardima (= stvara boolean vektor, gdje vraća prave indekse elemenata u njemu). Ali ovaj zapis čini značenje izraza jasnijim i koristite brze vektorske operacije umjesto sporih atomskih. Konceptualna razlika između vektorskog jezika i drugih jezika usporediva je s razlikom između imperativnog i funkcionalnog pristupa programiranju i na to morate biti spremni.
 
Neki korisnici također nisu zadovoljni QSQL-om. Poanta je da samo izgleda kao pravi SQL. U stvarnosti, to je samo tumač izraza sličnih SQL-u koji ne podržava optimizaciju upita. Korisnik mora sam napisati optimalne upite i to u Q-u, na što mnogi nisu spremni. S druge strane, naravno, uvijek možete sami napisati optimalan upit, umjesto da se oslanjate na optimizator crne kutije.
 
Kao plus, knjiga o Q - Q za smrtnike dostupna je besplatno na web stranica tvrtke, tu je skupljeno i mnogo drugih korisnih materijala.
 
Drugi veliki nedostatak je cijena licence. To su deseci tisuća dolara godišnje po CPU-u. Samo velike tvrtke mogu 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 najma KDB+ u Google i Amazon oblacima. KX nudi i preuzimanje besplatna verzija za nekomercijalne svrhe (32-bitna verzija ili 64-bitna na zahtjev).
 

natjecatelji

Postoji dosta specijaliziranih baza podataka izgrađenih na sličnim principima - stupčaste, u memoriji, fokusirane na vrlo velike količine podataka. Problem je što su to specijalizirane baze podataka. Upečatljiv primjer je Clickhouse. Ova baza podataka ima vrlo sličan princip kao KDB+ za pohranu podataka na disk i izgradnju indeksa; izvršava neke upite brže od KDB+, iako ne značajno. Ali čak i kao baza podataka, Clickhouse je specijaliziraniji od KDB+ - web analitika vs proizvoljne vremenske serije (ova je razlika vrlo bitna - zbog nje npr. u Clickhouseu nije moguće koristiti redoslijed zapisa). No, što je najvažnije, Clickhouse nema svestranost KDB+, jezika koji bi omogućio obradu podataka izravno u bazi podataka, umjesto da ih prvo učitava u zasebnu aplikaciju, gradeći proizvoljne SQL izraze, primjenjujući proizvoljne funkcije u upitu, stvarajući procese nije povezano s izvršavanjem funkcija povijesne baze podataka. Stoga je KDB+ teško uspoređivati ​​s drugim bazama podataka, možda su bolje u određenim slučajevima korištenja ili jednostavno bolje kada su u pitanju klasični zadaci baza podataka, ali ne znam za drugi jednako učinkovit i svestran alat za obradu privremenih podataka.
 

Python integracija

Kako bi KDB+ bio lakši za korištenje ljudima koji nisu upoznati s tehnologijom, KX je stvorio biblioteke za tijesnu integraciju s Pythonom unutar jednog procesa. Možete pozvati bilo koju Python funkciju iz Q-a ili obrnuto - pozvati bilo koju Q funkciju iz Pythona (osobito QSQL izraze). Knjižnice pretvaraju, ako je potrebno (ne uvijek zbog učinkovitosti), 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 nejasne. Kao rezultat toga, programer s jedne strane ima puni pristup brojnim korisnim Python bibliotekama, s druge strane dobiva brzu bazu za rad s velikim podacima integriranim u Python, što je posebno korisno za one koji se bave strojnim učenjem ili manekenstvo.
 
Rad s 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

Stranica tvrtke - 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 zaposlenika - https://code.kx.com/v2/wp/

Izvor: www.habr.com

Dodajte komentar