Baza podatkov KDB+: od financ do formule 1

KDB+, izdelek podjetja KX je v ozkih krogih splošno poznana, izjemno hitra, stolpična baza podatkov, namenjena shranjevanju časovnih vrst in na njih temelječih analitičnih izračunih. Sprva je bil (in je) zelo priljubljen v finančni industriji - uporablja ga vseh 10 najboljših investicijskih bank in številni znani hedge skladi, borze in druge organizacije. Pred kratkim se je KX odločil razširiti svojo bazo strank in zdaj ponuja rešitve na drugih področjih, kjer je velika količina podatkov, organiziranih časovno ali kako drugače – telekomunikacije, bioinformatika, proizvodnja itd. Postali so tudi partner ekipe Aston Martin Red Bull Racing v Formuli 1, kjer pomagajo zbirati in obdelovati podatke avtomobilskih senzorjev ter analizirati teste v vetrovniku. V tem članku vam želim povedati, zaradi katerih funkcij KDB+ je izjemno uspešen, zakaj so podjetja pripravljena porabiti veliko denarja zanj in končno, zakaj v resnici ni baza podatkov.
 
Baza podatkov KDB+: od financ do formule 1
 
V tem članku vam bom poskušal na splošno povedati, kaj je KDB+, kakšne zmožnosti in omejitve ima ter kakšne so njegove prednosti za podjetja, ki želijo obdelovati velike količine podatkov. Ne bom se spuščal v podrobnosti implementacije KDB+ ali podrobnosti njegovega programskega jezika Q. Obe temi sta zelo široki in si zaslužita ločena članka. Veliko informacij o teh temah lahko najdete na code.kx.com, vključno s knjigo Q - Q For Mortals (glejte spodnjo povezavo).

Nekaj ​​izrazov

  • Baza podatkov v pomnilniku. Baza podatkov, ki shranjuje podatke v RAM za hitrejši dostop. Prednosti takšne baze podatkov so očitne, slabosti pa so možnost izgube podatkov in potreba po velikem pomnilniku na strežniku.
  • Stolpčna baza podatkov. Baza podatkov, kjer so podatki shranjeni stolpec za stolpcem in ne zapis za zapisom. Glavna prednost takšne zbirke podatkov je, da so podatki iz enega stolpca shranjeni skupaj na disku in v pomnilniku, kar bistveno pohitri dostop do njih. Ni treba naložiti stolpcev, ki niso uporabljeni v poizvedbi. Glavna pomanjkljivost je, da je zapise težko spreminjati in brisati.
  • Časovne serije. Podatki s stolpcem z datumom ali uro. Običajno je časovno vrstni red pomemben za takšne podatke, tako da lahko preprosto določite, kateri zapis je pred ali za trenutnim, ali da uporabite funkcije, katerih rezultati so odvisni od vrstnega reda zapisov. Klasične baze podatkov so zgrajene po povsem drugačnem principu – predstavljajo zbirko zapisov kot niz, kjer vrstni red zapisov načeloma ni določen.
  • Vektor. V kontekstu KDB+ je to seznam elementov iste atomske vrste, na primer števil. Z drugimi besedami, niz elementov. Matrike je za razliko od seznamov mogoče kompaktno shraniti in obdelati z uporabo navodil vektorskega procesorja.

 

Zgodovinski podatki

KX je leta 1993 ustanovil Arthur Whitney, ki je prej delal pri banki Morgan Stanley na jeziku A+, nasledniku APL – zelo izvirnem in včasih priljubljenem jeziku v finančnem svetu. Seveda je Arthur v KX nadaljeval v istem duhu in ustvaril vektorsko-funkcionalni jezik K, ki ga vodijo ideje radikalnega minimalizma. Programi K so videti kot mešanica ločil in posebnih znakov, pomen znakov in funkcij je odvisen od konteksta, vsaka operacija pa ima veliko več pomena kot v običajnih programskih jezikih. Zaradi tega program K zavzame minimalno prostora – nekaj vrstic lahko nadomesti strani besedila v besednem jeziku, kot je Java – in je super koncentrirana izvedba algoritma.
 
Funkcija v K, ki izvaja večino generatorja razčlenjevalnika LL1 v skladu z dano slovnico:

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 to filozofijo ekstremne učinkovitosti z minimalnimi telesnimi gibi poosebljal v KDB+, ki se je pojavil leta 2003 (mislim, da je zdaj jasno, od kod črka K v imenu) in ni nič drugega kot interpret četrte različice K. Uporabniku prijaznejša različica je bila dodana na vrh K K, imenovana Q. Q je dodal tudi podporo za določeno narečje SQL - QSQL in tolmač - podporo za tabele kot sistemski podatkovni tip, orodja za delo s tabelami v pomnilniku in na disku itd.
 
Torej je z vidika uporabnika KDB+ preprosto tolmač jezika Q s podporo za tabele in izraze v slogu LINQ, podobne SQL, iz C#. To je najpomembnejša razlika med KDB+ in drugimi zbirkami podatkov in njena glavna konkurenčna prednost, ki je pogosto spregledana. To ni baza podatkov + onemogočen pomožni jezik, ampak polnopravni zmogljiv programski jezik + vgrajena podpora za funkcije baze podatkov. Ta razlika bo igrala odločilno vlogo pri naštevanju vseh prednosti KDB+. Na primer …
 

Velikost

Po sodobnih standardih je KDB+ preprosto mikroskopske velikosti. To je dobesedno ena podmegabajtna izvršljiva datoteka in ena majhna besedilna datoteka z nekaterimi sistemskimi funkcijami. V resnici - manj kot en megabajt, za ta program pa podjetja plačujejo več deset tisoč dolarjev na leto za en procesor na strežniku.

  • Ta velikost omogoča, da se KDB+ odlično počuti na kateri koli strojni opremi – od mikroračunalnika Pi do strežnikov s terabajti pomnilnika. To na noben način ne vpliva na funkcionalnost, poleg tega se Q zažene takoj, kar omogoča, da se med drugim uporablja tudi kot skriptni jezik.
  • Pri tej velikosti se tolmač Q v celoti prilega procesorskemu predpomnilniku, kar pospeši izvajanje programa.
  • Pri tej velikosti izvršljive datoteke proces Q zavzame zanemarljivo malo prostora v pomnilniku; lahko jih zaženete na stotine. Poleg tega lahko Q po potrebi deluje z desetinami ali stotinami gigabajtov pomnilnika v enem samem procesu.

vsestranskost

Q je odličen za široko paleto aplikacij. Proces Q lahko deluje kot zgodovinska zbirka podatkov in omogoča hiter dostop do terabajtov informacij. Na primer, imamo na desetine zgodovinskih baz podatkov, v nekaterih izmed njih en nestisnjen dan podatkov zavzame več kot 100 gigabajtov. Vendar pa bo pod razumnimi omejitvami poizvedba v bazi podatkov zaključena v desetinah do stotinah milisekund. Na splošno imamo univerzalno časovno omejitev za uporabniške zahteve - 30 sekund - in deluje zelo redko.
 
Q bi prav tako zlahka lahko bila baza podatkov v pomnilniku. Novi podatki se v tabele v pomnilniku dodajajo tako hitro, da so zahteve uporabnikov omejevalni dejavnik. Podatki v tabelah so shranjeni v stolpcih, kar pomeni, da bo vsaka operacija v stolpcu uporabila predpomnilnik procesorja s polno zmogljivostjo. Poleg tega je KX poskušal implementirati vse osnovne operacije, kot je aritmetika, prek vektorskih navodil procesorja, s čimer je maksimiziral njihovo hitrost. Q lahko izvaja tudi naloge, ki niso tipične za podatkovne baze - na primer obdeluje pretočne podatke in izračuna v "realnem času" (z zamikom od deset milisekund do nekaj sekund, odvisno od naloge) različne funkcije združevanja za finančne instrumente za različne čase. intervalih ali zgraditi model vpliva popolnih transakcij na trg in izvesti njegovo profiliranje skoraj takoj po njegovem zaključku. Pri takšnih nalogah najpogosteje glavni časovni zamik ni Q, temveč potreba po sinhronizaciji podatkov iz različnih virov. Visoka hitrost je dosežena zaradi dejstva, da so podatki in funkcije, ki jih obdelujejo, v enem procesu, obdelava pa je zmanjšana na izvajanje več QSQL izrazov in združevanj, ki se ne interpretirajo, ampak se izvajajo z binarno kodo.
 
Končno lahko v Q napišete kateri koli storitveni proces. Na primer, procesi Gateway samodejno razdelijo uporabniške zahteve v potrebne baze podatkov in strežnike. Programer ima popolno svobodo pri izvajanju katerega koli algoritma za uravnoteženje, določanje prioritet, toleranco napak, pravice dostopa, kvote in v bistvu vse, kar mu srce poželi. Glavna težava pri tem je, da boste morali vse to izvajati sami.
 
Kot primer bom naštel, katere vrste procesov imamo. Vse se aktivno uporabljajo in delujejo skupaj, združujejo na desetine različnih baz podatkov v eno, obdelujejo podatke iz več virov in služijo na stotine uporabnikov in aplikacij.

  • Konektorji (feedhandler) za vire podatkov. Ti procesi običajno uporabljajo zunanje knjižnice, ki so naložene v Q. Vmesnik C v Q je izjemno preprost in omogoča preprosto ustvarjanje funkcij proxy za katero koli knjižnico C/C++. Q je dovolj hiter, da na primer obdela poplavo sporočil FIX z vseh evropskih borz hkrati.
  • Distributerji podatkov (tickerplant), ki služijo kot vmesni člen med priključki in porabniki. Hkrati zapišejo dohodne podatke v poseben binarni dnevnik, kar potrošnikom zagotavlja odpornost proti izgubam povezave ali ponovnim zagonom.
  • Baza podatkov v pomnilniku (rdb). Te zbirke podatkov zagotavljajo najhitrejši dostop do neobdelanih, svežih podatkov, tako da jih shranijo v pomnilnik. Običajno podnevi kopičijo podatke v tabelah in jih ponoči ponastavijo.
  • Obstoj baze podatkov (pdb). Te podatkovne baze zagotavljajo, da so današnji podatki shranjeni v zgodovinski bazi podatkov. Praviloma za razliko od rdb podatkov ne shranjujejo v pomnilnik, ampak podnevi uporabljajo poseben predpomnilnik na disku in podatke opolnoči prekopirajo v zgodovinsko bazo.
  • Zgodovinske baze podatkov (hdb). Te zbirke podatkov omogočajo dostop do podatkov za prejšnje dni, mesece in leta. Njihova velikost (v dnevih) je omejena samo z velikostjo trdih diskov. Podatki se lahko nahajajo kjer koli, zlasti na različnih diskih za hitrejši dostop. Podatke je mogoče stisniti z uporabo več algoritmov, med katerimi lahko izbirate. Struktura baze podatkov je dobro dokumentirana in enostavna, podatki so shranjeni po stolpcih v običajnih datotekah, tako da jih je mogoče obdelati tudi s pomočjo operacijskega sistema.
  • Baze podatkov z agregiranimi informacijami. Shranjujejo različne agregacije, običajno z, razvrščene po imenu instrumenta in časovnem intervalu. Baze podatkov v pomnilniku posodobijo svoje stanje z vsakim dohodnim sporočilom, zgodovinske baze podatkov pa shranijo vnaprej izračunane podatke, da pospešijo dostop do zgodovinskih podatkov.
  • Končno, prehodni procesiservisiranje aplikacij in uporabnikov. Q vam omogoča implementacijo popolnoma asinhrone obdelave dohodnih sporočil, njihovo distribucijo po bazah podatkov, preverjanje pravic dostopa itd. Upoštevajte, da sporočila niso omejena in največkrat niso izrazi SQL, kot je to v primeru drugih podatkovnih zbirk. Najpogosteje je izraz SQL skrit v posebni funkciji in je sestavljen na podlagi parametrov, ki jih zahteva uporabnik - čas se pretvori, filtrira, podatki se normalizirajo (na primer cena delnice se izenači, če so bile izplačane dividende) itd.

Tipična arhitektura za en tip podatkov:

Baza podatkov KDB+: od financ do formule 1

Hitro

Čeprav je Q interpretirani jezik, je tudi vektorski jezik. To pomeni, da številne vgrajene funkcije, zlasti aritmetične, sprejemajo argumente katere koli oblike - števila, vektorje, matrike, sezname - in od programerja se pričakuje, da bo program implementiral kot operacije polja. V takem jeziku, če dodate dva vektorja milijona elementov, ni več pomembno, da se jezik interpretira; seštevanje bo opravila super optimizirana binarna funkcija. Ker je levji delež časa v programih Q porabljen za operacije s tabelami, ki uporabljajo te osnovne vektorizirane funkcije, je rezultat zelo spodobna hitrost delovanja, kar nam omogoča obdelavo ogromne količine podatkov tudi v enem procesu. To je podobno matematičnim knjižnicam v Pythonu - čeprav je sam Python zelo počasen jezik, ima veliko odličnih knjižnic, kot je numpy, ki vam omogočajo obdelavo numeričnih podatkov s hitrostjo prevedenega jezika (mimogrede, numpy je ideološko blizu Q ).
 
Poleg tega je KX zelo skrbno pristopil k oblikovanju tabel in optimizaciji dela z njimi. Prvič, podprtih je več vrst indeksov, ki jih podpirajo vgrajene funkcije in jih je mogoče uporabiti ne le za stolpce tabele, temveč tudi za vse vektorje - združevanje, razvrščanje, atribut edinstvenosti in posebno združevanje za zgodovinske baze podatkov. Indeks se uporablja preprosto in se samodejno prilagodi pri dodajanju elementov v stolpec/vektor. Indekse je mogoče enako uspešno uporabiti za stolpce tabele v pomnilniku in na disku. Pri izvajanju poizvedbe QSQL se indeksi uporabljajo samodejno, če je to mogoče. Drugič, delo z zgodovinskimi podatki poteka prek mehanizma za prikaz datotek OS (memory map). Velike tabele se nikoli ne naložijo v pomnilnik; namesto tega se potrebni stolpci preslikajo neposredno v pomnilnik in dejansko se naloži le tisti njihov del (tukaj pomagajo tudi indeksi), ki je potreben. Programerju je vseeno, ali so podatki v pomnilniku ali ne, mehanizem za delo z mmap je popolnoma skrit v globinah Q.
 
KDB+ ni relacijska zbirka podatkov, tabele lahko vsebujejo poljubne podatke, vrstni red vrstic v tabeli pa se ob dodajanju novih elementov ne spremeni in ga lahko in moramo uporabiti pri pisanju poizvedb. Ta funkcija je nujno potrebna za delo s časovnimi vrstami (podatki iz central, telemetrija, dnevniki dogodkov), ker če so podatki razvrščeni po času, potem uporabniku ni treba uporabiti nobenih trikov SQL, da bi našel prvo ali zadnjo vrstico ali N vrstice v tabeli, določite, katera vrstica sledi N-ti vrstici itd. Združevanje tabel je še bolj poenostavljeno, na primer iskanje zadnje ponudbe za 16000 transakcij VOD.L (Vodafone) v tabeli s 500 milijoni elementov traja približno sekundo na disku in več deset milisekund v pomnilniku.
 
Primer časovnega združevanja – tabela ponudb je preslikana v pomnilnik, tako da ni treba navesti VOD.L v mestu, kjer se uporabljata indeks simbolnega stolpca in dejstvo, da so podatki razvrščeni po času. Skoraj vsa združevanja v Q so običajne funkcije in niso del izbranega izraza:

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

Nazadnje velja omeniti, da so inženirji pri KX, začenši s samim Arthurjem Whitneyjem, resnično obsedeni z učinkovitostjo in se zelo trudijo, da kar najbolje izkoristijo standardne funkcije Q-ja in optimizirajo najpogostejše vzorce uporabe.
 

Skupaj

KDB+ je med podjetji priljubljen predvsem zaradi svoje izjemne vsestranskosti – enako dobro služi kot baza podatkov v pomnilniku, kot baza za shranjevanje terabajtov zgodovinskih podatkov in kot platforma za analizo podatkov. Zaradi dejstva, da se obdelava podatkov odvija neposredno v bazi podatkov, se doseže visoka hitrost dela in prihranek virov. Popoln programski jezik, integriran s funkcijami baze podatkov, vam omogoča implementacijo celotnega niza potrebnih procesov na eni platformi - od prejemanja podatkov do obdelave uporabniških zahtev.
 

Za več informacij,

Omejitve

Bistvena pomanjkljivost KDB+/Q je visok vstopni prag. Jezik ima čudno sintakso, nekatere funkcije so močno preobremenjene (vrednost ima na primer približno 11 primerov uporabe). Najpomembneje pa je, da zahteva radikalno drugačen pristop k pisanju programov. V vektorskem jeziku morate vedno razmišljati v smislu matričnih transformacij, izvajati vse zanke skozi več različic funkcij preslikave/zmanjšanja (ki se v Q imenujejo prislovi) in nikoli ne poskušati prihraniti denarja z zamenjavo vektorskih operacij z atomskimi. Če želite na primer najti indeks N-te pojavitve elementa v matriki, morate zapisati:

1. (where element=vector)[N]  

čeprav se zdi to po standardih C/Java strašno neučinkovito (= ustvari logični vektor, kjer vrne prave indekse elementov v njem). Toda ta zapis naredi pomen izraza bolj jasen in namesto počasnih atomskih uporabljate hitre vektorske operacije. Konceptualna razlika med vektorskim jezikom in drugimi je primerljiva z razliko med imperativnim in funkcionalnim pristopom k programiranju in na to morate biti pripravljeni.
 
Nekateri uporabniki tudi niso zadovoljni s QSQL. Bistvo je, da le izgleda kot pravi SQL. V resnici je le tolmač izrazov, podobnih SQL, ki ne podpira optimizacije poizvedb. Uporabnik mora sam napisati optimalne poizvedbe in to v Q, na kar mnogi niso pripravljeni. Po drugi strani pa lahko seveda vedno sami napišete optimalno poizvedbo, namesto da se zanašate na optimizator črne skrinjice.
 
Poleg tega je knjiga o Q - Q za smrtnike na voljo brezplačno na Spletna stran, tam je zbranih tudi veliko drugih uporabnih materialov.
 
Druga velika pomanjkljivost je cena licence. To je več deset tisoč dolarjev na leto na CPU. Le velika podjetja si lahko privoščijo takšne stroške. Pred kratkim je KX svojo politiko licenciranja naredil bolj prilagodljiv in ponuja možnost plačila samo za čas uporabe ali najema KDB+ v oblakih Google in Amazon. KX ponuja tudi za prenos brezplačna različica za nekomercialne namene (32-bitna različica ali 64-bitna na zahtevo).
 

konkurenti

Obstaja kar nekaj specializiranih baz podatkov, zgrajenih po podobnih principih – stolpčnih, v pomnilniku, osredotočenih na zelo velike količine podatkov. Težava je v tem, da gre za specializirane zbirke podatkov. Osupljiv primer je Clickhouse. Ta zbirka podatkov ima zelo podoben princip kot KDB+ za shranjevanje podatkov na disk in gradnjo indeksa; izvaja nekatere poizvedbe hitreje kot KDB+, čeprav ne bistveno. Toda tudi kot baza podatkov je Clickhouse bolj specializiran kot KDB+ - spletna analitika proti poljubnim časovnim vrstam (ta razlika je zelo pomembna - zaradi nje npr. v Clickhouseu ni mogoče uporabiti vrstnega reda zapisov). Najpomembneje pa je, da Clickhouse nima vsestranskosti KDB+, jezika, ki bi omogočal obdelavo podatkov neposredno v bazi podatkov, namesto da bi jih najprej naložili v ločeno aplikacijo, gradili poljubne izraze SQL, uporabljali poljubne funkcije v poizvedbi, ustvarjali procese. ni povezano z izvajanjem funkcij zgodovinske zbirke podatkov. Zato KDB+ težko primerjam z drugimi podatkovnimi bazami, morda so boljše v določenih primerih uporabe ali preprosto boljše, ko gre za klasična opravila podatkovnih baz, vendar drugega enako učinkovitega in vsestranskega orodja za obdelavo začasnih podatkov ne poznam.
 

Python integracija

Za lažjo uporabo KDB+ za ljudi, ki ne poznajo tehnologije, je KX ustvaril knjižnice za tesno integracijo s Pythonom v enem samem procesu. Iz Q lahko pokličete katero koli funkcijo Python ali obratno – pokličete katero koli funkcijo Q iz Pythona (zlasti izraze QSQL). Knjižnice po potrebi (ne vedno zaradi učinkovitosti) pretvorijo podatke iz formata enega jezika v format drugega. Zaradi tega živita Q in Python v tako tesni simbiozi, da so meje med njima zabrisane. Posledično ima programer na eni strani popoln dostop do številnih uporabnih knjižnic Python, na drugi strani pa prejme hitro osnovo za delo z velikimi podatki, integriranimi v Python, kar je še posebej uporabno za tiste, ki se ukvarjajo s strojnim učenjem. ali manekenstvo.
 
Delo s Q v 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

Spletna stran podjetja - https://kx.com/
Spletno mesto za razvijalce - https://code.kx.com/v2/
Knjiga Q za smrtnike (v angleščini) - https://code.kx.com/q4m3/
Članki o aplikacijah KDB+/Q zaposlenih v kx - https://code.kx.com/v2/wp/

Vir: www.habr.com

Dodaj komentar