KDB+ andmebaas: rahandusest vormel 1-ni

KDB+, ettevõtte toode KX on kitsastes ringkondades laialt tuntud ülikiire veeruline andmebaas, mis on mõeldud aegridade ja nende põhjal tehtud analüütiliste arvutuste salvestamiseks. Algselt oli (ja on) see finantssektoris väga populaarne – seda kasutavad kõik top 10 investeerimispanka ning paljud tuntud riskifondid, börsid ja muud organisatsioonid. Hiljuti otsustas KX oma kliendibaasi laiendada ja pakkuda nüüd lahendusi ka teistes valdkondades, kus on ajaliselt või muul viisil organiseeritud andmemaht - telekom, bioinformaatika, tootmine jne. Samuti said nad Aston Martin Red Bull Racing meeskonna partneriks vormel 1-s, kus nad aitavad koguda ja töödelda autoandurite andmeid ning analüüsida tuuletunneli teste. Selles artiklis tahan teile rääkida, millised KDB+ funktsioonid muudavad selle suurepäraseks, miks on ettevõtted nõus sellele palju raha kulutama ja lõpuks, miks see pole tegelikult andmebaas.
 
KDB+ andmebaas: rahandusest vormel 1-ni
 
Selles artiklis püüan teile üldiselt rääkida, mis on KDB+, millised võimalused ja piirangud sellel on ning millised on selle eelised ettevõtetele, kes soovivad töödelda suuri andmemahtusid. Ma ei lasku KDB+ juurutamise ega selle Q programmeerimiskeele üksikasjadesse, mõlemad teemad on väga laiaulatuslikud ja väärivad eraldi artikleid. Palju teavet nende teemade kohta leiate saidilt code.kx.com, sealhulgas raamatut Q - Q Fortals (vt linki allpool).

Mõned terminid

  • Mälusisene andmebaas. Andmebaas, mis salvestab andmed kiiremaks juurdepääsuks RAM-i. Sellise andmebaasi eelised on selged, kuid miinuseks on andmete kadumise võimalus ja vajadus omada serveris palju mälu.
  • Veergude andmebaas. Andmebaas, kus andmeid salvestatakse veergude kaupa, mitte kirje kaupa. Sellise andmebaasi peamine eelis on see, et ühes veerus olevad andmed salvestatakse koos kettale ja mällu, mis kiirendab oluliselt juurdepääsu sellele. Pole vaja laadida veerge, mida päringus ei kasutata. Peamine puudus on see, et kirjeid on raske muuta ja kustutada.
  • Aegrida. Andmed kuupäeva või kellaaja veeruga. Tavaliselt on selliste andmete puhul oluline ajaline järjestus, et saaksite hõlpsasti kindlaks teha, milline kirje eelneb või järgneb praegusele, või rakendada funktsioone, mille tulemused sõltuvad kirjete järjekorrast. Klassikalised andmebaasid on üles ehitatud hoopis teisel põhimõttel – kirjete kogumit kujutades komplektina, kus kirjete järjekord on põhimõtteliselt määratlemata.
  • Vektor. KDB+ kontekstis on see sama aatomitüübi elementide loend, näiteks numbrid. Teisisõnu, elementide massiiv. Erinevalt loenditest saab massiive salvestada kompaktselt ja töödelda vektorprotsessori juhiste abil.

 

Ajaloolised andmed

KX-i asutas 1993. aastal Arthur Whitney, kes töötas varem Morgan Stanley pangas A+ keele kallal, mis on APL-i järeltulija – väga originaalne ja omal ajal finantsmaailmas populaarne keel. Muidugi jätkas Arthur KX-is samas vaimus ja lõi vektor-funktsionaalse keele K, juhindudes radikaalse minimalismi ideedest. K-programmid näevad välja nagu kirjavahemärkide ja erimärkide segadus, märkide ja funktsioonide tähendus sõltub kontekstist ning igal toimingul on palju suurem tähendus kui tavapärastes programmeerimiskeeltes. Tänu sellele võtab K-programm minimaalselt ruumi – mõni rida võib asendada lehekülgi paljusõnalises keeles nagu Java – ja on algoritmi ülikontsentreeritud teostus.
 
Funktsioon K-s, mis rakendab suurema osa LL1 parseri generaatorist vastavalt antud grammatikale:

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 kehastas seda äärmise tõhususe filosoofiat minimaalse kehaliigutusega KDB+-s, mis ilmus 2003. aastal (ma arvan, et nüüd on selge, kust nimes olev K-täht pärineb) ja mis on midagi muud kui K-i neljanda versiooni tõlgendus. K K-le on lisatud kasutajasõbralikum versioon nimega Q. Q lisas ka SQL-i spetsiifilise murde - QSQL - toe ja tõlk - tabelite kui süsteemi andmetüübi tugi, tööriistad tabelitega töötamiseks mälus ja kettal jne.
 
Nii et kasutaja vaatenurgast on KDB+ lihtsalt Q-keeletõlk, mis toetab tabeleid ja SQL-i sarnaseid LINQ-stiilis väljendeid C#-st. See on kõige olulisem erinevus KDB+ ja teiste andmebaaside vahel ning selle peamine konkurentsieelis, mis sageli tähelepanuta jäetakse. See pole andmebaas + keelatud abikeel, vaid täieõiguslik võimas programmeerimiskeel + andmebaasi funktsioonide sisseehitatud tugi. See eristus mängib Korea Arengupanga+ kõigi eeliste loetlemisel otsustavat rolli. Näiteks…
 

Suurus

Kaasaegsete standardite järgi on KDB+ lihtsalt mikroskoopilise suurusega. See on sõna otseses mõttes üks alammegabaidine käivitatav fail ja üks väike tekstifail, millel on mõned süsteemifunktsioonid. Tegelikkuses - alla ühe megabaidi ja selle programmi eest maksavad ettevõtted ühe serveri protsessori eest aastas kümneid tuhandeid dollareid.

  • See suurus võimaldab KDB+-l end suurepäraselt tunda mis tahes riistvara puhul – alates Pi-mikroarvutist kuni terabaitide mäluga serveriteni. Funktsionaalsust see kuidagi ei mõjuta, pealegi käivitub Q koheselt, mis võimaldab seda kasutada muuhulgas ka skriptikeelena.
  • Selle suuruse juures mahub Q-tõlk täielikult protsessori vahemällu, mis kiirendab programmi täitmist.
  • Sellise täitmisfaili suuruse korral võtab Q-protsess mälus vähe ruumi; saate neid sadu käitada. Pealegi saab Q vajadusel töötada ühe protsessi jooksul kümnete või sadade gigabaitide mäluga.

mitmekülgsus

Q sobib suurepäraselt paljude rakenduste jaoks. Protsess Q võib toimida ajaloolise andmebaasina ja pakkuda kiiret juurdepääsu terabaitidele teabele. Näiteks on meil kümneid ajaloolisi andmebaase, millest mõnes võtab üks tihendamata päev andmeid üle 100 gigabaidi. Mõistlike piirangute korral täidetakse andmebaasi päring aga kümnete kuni sadade millisekunditega. Üldiselt on meil kasutajapäringute jaoks universaalne ajalõpp – 30 sekundit – ja see töötab väga harva.
 
Q võib sama lihtsalt olla mälusisene andmebaas. Uued andmed lisatakse mälusisestesse tabelitesse nii kiiresti, et piiravaks teguriks on kasutajate päringud. Andmed tabelites salvestatakse veergudesse, mis tähendab, et mis tahes toiming veeruga kasutab protsessori vahemälu täisvõimsusel. Lisaks sellele püüdis KX protsessori vektorkäskude kaudu rakendada kõiki põhitoiminguid, näiteks aritmeetikat, maksimeerides nende kiirust. Q saab täita ka ülesandeid, mis pole andmebaasidele tüüpilised – näiteks töödelda voogedastusandmeid ja arvutada “reaalajas” (viivitusega kümnetest millisekunditest kuni mitme sekundini, olenevalt ülesandest) erinevaid finantsinstrumentide koondamisfunktsioone erinevatel aegadel. intervallidega või koostage mudel täiuslike tehingute mõjust turule ja viige selle profileerimine läbi peaaegu kohe pärast selle valmimist. Selliste ülesannete puhul ei ole enamasti peamine viivitus Q, vaid vajadus sünkroonida andmeid erinevatest allikatest. Suur kiirus saavutatakse tänu sellele, et andmed ja neid töötlevad funktsioonid on ühes protsessis ning töötlemine taandub mitme QSQL avaldise ja liitumise täitmiseks, mida ei tõlgendata, vaid täidetakse kahendkoodiga.
 
Lõpuks saate Q-sse kirjutada mis tahes teenindusprotsesse. Näiteks Gateway protsessid, mis jaotavad kasutajate päringud automaatselt vajalikesse andmebaasidesse ja serveritesse. Programmeerijal on täielik vabadus rakendada mis tahes tasakaalustamise, prioriseerimise, tõrketaluvuse, juurdepääsuõiguste, kvootide ja põhimõtteliselt kõike muud, mida ta süda ihkab, algoritme. Peamine probleem on see, et peate selle kõik ise ellu viima.
 
Näitena loetlen, mis tüüpi protsesse meil on. Kõik need on aktiivselt kasutusel ja töötavad koos, ühendades kümneid erinevaid andmebaase üheks, töödeldes andmeid mitmest allikast ning teenindades sadu kasutajaid ja rakendusi.

  • Ühendused (feedhandler) andmeallikatega. Need protsessid kasutavad tavaliselt väliseid teeke, mis laaditakse Q-sse. Q-liides on äärmiselt lihtne ja võimaldab hõlpsasti luua puhverserveri funktsioone mis tahes C/C++ teegi jaoks. Q on piisavalt kiire, et käsitleda näiteks FIX-teadete tulva korraga kõigilt Euroopa börsidelt.
  • Andmete levitajad (tickerplant), mis toimivad vahelülina pistikute ja tarbijate vahel. Samal ajal kirjutavad nad sissetulevad andmed spetsiaalsesse binaarlogi, pakkudes tarbijatele vastupidavust ühenduse katkemise või taaskäivitamise vastu.
  • Mälusisene andmebaas (rdb). Need andmebaasid võimaldavad kiireimat juurdepääsu värsketele toorandmetele, salvestades need mällu. Tavaliselt koguvad nad päeva jooksul andmeid tabelitesse ja lähtestavad need öösel.
  • Püsi andmebaas (pdb). Need andmebaasid tagavad, et tänased andmed salvestatakse ajaloolises andmebaasis. Reeglina erinevalt rdb-st ei salvesta nad andmeid mällu, vaid kasutavad päeval spetsiaalset vahemälu kettal ja kopeerivad andmed südaööl ajaloolisesse andmebaasi.
  • Ajaloolised andmebaasid (hdb). Need andmebaasid võimaldavad juurdepääsu eelmiste päevade, kuude ja aastate andmetele. Nende suurust (päevades) piirab ainult kõvaketaste suurus. Andmed võivad asuda kõikjal, eriti erinevatel ketastel, et kiirendada juurdepääsu. Andmeid on võimalik tihendada mitme algoritmi abil. Andmebaasi ülesehitus on hästi dokumenteeritud ja lihtne, andmed salvestatakse veergude kaupa tavafailidesse, mistõttu on neid võimalik töödelda, sh operatsioonisüsteemi abil.
  • Andmebaasid koondatud teabega. Nad salvestavad erinevaid liite, tavaliselt koos, rühmitatud instrumendi nime ja ajaintervalli järgi. Mälus olevad andmebaasid värskendavad oma olekut iga sissetuleva sõnumiga ja ajaloolised andmebaasid salvestavad eelarvutatud andmeid, et kiirendada juurdepääsu ajaloolistele andmetele.
  • Lõpuks lüüsi protsessidrakenduste ja kasutajate teenindamine. Q võimaldab rakendada sissetulevate sõnumite täiesti asünkroonset töötlemist, nende jaotamist andmebaaside vahel, juurdepääsuõiguste kontrollimist jne. Pange tähele, et sõnumid ei ole piiratud ja enamasti ei ole need SQL-avaldised, nagu see on teiste andmebaaside puhul. Enamasti on SQL-avaldis peidetud spetsiaalsesse funktsiooni ja konstrueeritakse lähtuvalt kasutaja nõutud parameetritest - aeg teisendatakse, filtreeritakse, andmeid normaliseeritakse (näiteks aktsia hind võrdsustatakse, kui maksti dividende) jne.

Tüüpiline arhitektuur ühe andmetüübi jaoks:

KDB+ andmebaas: rahandusest vormel 1-ni

Kiirus

Kuigi Q on tõlgenduskeel, on see ka vektorkeel. See tähendab, et paljud sisseehitatud funktsioonid, eriti aritmeetilised, võtavad mis tahes kujul argumendid - arvud, vektorid, maatriksid, loendid - ja programmeerija peaks programmi rakendama massiivioperatsioonidena. Sellises keeles, kui liita kaks miljonist elemendist koosnevat vektorit, pole enam tähtsust, et keelt tõlgendatakse, lisamise teostab ülioptimiseeritud kahendfunktsioon. Kuna Q-programmides kulub lõviosa ajast toimingutele tabelitega, mis kasutavad neid põhilisi vektoriseeritud funktsioone, on väljundiks väga korralik töökiirus, mis võimaldab meil töödelda tohutul hulgal andmeid isegi ühes protsessis. See sarnaneb Pythoni matemaatiliste raamatukogudega – kuigi Python ise on väga aeglane keel, on sellel palju suurepäraseid teeke nagu numpy, mis võimaldavad töödelda arvulisi andmeid kompileeritud keele kiirusega (muide, numpy on ideoloogiliselt Q-le lähedane ).
 
Lisaks lähenes KX tabelite kujundamisele ja nendega töö optimeerimisele väga hoolikalt. Esiteks toetatakse mitut tüüpi indekseid, mida toetavad sisseehitatud funktsioonid ja mida saab rakendada mitte ainult tabeli veergudele, vaid ka mis tahes vektoritele - rühmitamine, sortimine, unikaalsuse atribuut ja ajalooliste andmebaaside spetsiaalne rühmitamine. Indeksit rakendatakse lihtsalt ja seda kohandatakse automaatselt elementide lisamisel veergu/vektorisse. Indekseid saab võrdselt edukalt rakendada tabeli veergudele nii mälus kui ka kettal. QSQL-päringu täitmisel kasutatakse indekseid võimalusel automaatselt. Teiseks toimub töö ajalooliste andmetega läbi OS-i failide kuvamise mehhanismi (mälukaart). Suuri tabeleid ei laeta kunagi mällu, selle asemel kaardistatakse vajalikud veerud otse mällu ja reaalselt laetakse ainult see osa (siin on abiks ka indeksid), mida vaja on. Programmeerija jaoks pole vahet, kas andmed on mälus või mitte, mmap-iga töötamise mehhanism on Q sügavustes täielikult peidus.
 
KDB+ ei ole relatsiooniline andmebaas, tabelid võivad sisaldada suvalisi andmeid, samas kui tabeli ridade järjekord ei muutu uute elementide lisamisel ning seda saab ja tuleks kasutada päringute kirjutamisel. Seda funktsiooni on hädasti vaja aegridadega töötamiseks (andmed vahetustest, telemeetria, sündmuste logid), sest kui andmed on aja järgi sorteeritud, siis ei pea kasutaja esimese või viimase rea või N leidmiseks kasutama mingeid SQL-i nippe. tabeli ridu , määrake, milline rida järgneb N-ndale reale jne. Tabelite ühendamine on veelgi lihtsustatud, näiteks 16000 miljoni elemendiga tabelist 500 XNUMX VOD.L (Vodafone) tehingu viimase hinnapakkumise leidmine võtab kettal umbes sekundi ja mälus kümneid millisekundeid.
 
Ajalise liitumise näide – hinnapakkumiste tabel kaardistatakse mällu, seega ei ole vaja VOD.L-i kuhu määrata, kaudselt kasutatakse sümboli veeru indeksit ja asjaolu, et andmed on sorteeritud aja järgi. Peaaegu kõik ühendused Q-s on regulaarfunktsioonid, mitte valitud avaldise osad:

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

Lõpetuseks väärib märkimist, et KX-i insenerid, alustades Arthur Whitneyst endast, on tõhususe pärast tõeliselt kinnisideeks ja näevad palju vaeva, et Q standardfunktsioonidest maksimumi võtta ja levinumaid kasutusmustreid optimeerida.
 

Summaarne

KDB+ on ettevõtete seas populaarne eelkõige tänu oma erakordsele mitmekülgsusele – see toimib ühtviisi hästi nii mälusiseste andmebaasidena, ajalooliste andmete terabaitide salvestamise andmebaasina kui ka andmeanalüüsi platvormina. Tänu sellele, et andmetöötlus toimub otse andmebaasis, saavutatakse suur töökiirus ja ressursi kokkuhoid. Täielik andmebaasifunktsioonidega integreeritud programmeerimiskeel võimaldab ühel platvormil realiseerida kogu virna vajalikke protsesse – alates andmete vastuvõtmisest kuni kasutaja päringute töötlemiseni.
 

Lisateavet

Piirangud

KDB+/Q oluline puudus on kõrge sisenemislävi. Keel on kummalise süntaksiga, mõned funktsioonid on tugevalt ülekoormatud (väärtusel on näiteks umbes 11 kasutusjuhtu). Kõige tähtsam on see, et see nõuab radikaalselt teistsugust lähenemist programmide kirjutamisele. Vektorkeeles tuleb alati mõelda massiiviteisendustele, realiseerida kõik tsüklid kaardistamise/vähendamise funktsioonide mitme variandi kaudu (mida Q-s nimetatakse määrsõnadeks) ja mitte kunagi püüda säästa raha, asendades vektortehteid atomaarsete tehtetega. Näiteks massiivi elemendi N-kordse esinemise indeksi leidmiseks peaksite kirjutama:

1. (where element=vector)[N]  

kuigi see tundub C/Java standardite järgi kohutavalt ebaefektiivne (= loob loogilise vektori, kus tagastab selles sisalduvate elementide tõelised indeksid). Kuid see tähistus muudab väljendi tähenduse selgemaks ja te kasutate aeglaste aatomite asemel kiireid vektoroperatsioone. Kontseptuaalne erinevus vektorkeele ja teiste vahel on võrreldav erinevusega programmeerimise kohustuslike ja funktsionaalsete lähenemisviiside vahel ning selleks peate olema valmis.
 
Mõned kasutajad pole ka QSQL-iga rahul. Asi on selles, et see näeb välja ainult tõelise SQL-i moodi. Tegelikkuses on see lihtsalt SQL-i sarnaste väljendite tõlk, mis ei toeta päringu optimeerimist. Kasutaja peab ise kirjutama optimaalsed päringud ja Q-s, milleks paljud valmis pole. Teisest küljest saate muidugi alati ise optimaalse päringu kirjutada, mitte loota musta kasti optimeerijale.
 
Lisaks on raamat teemal Q - Q For Mortals tasuta saadaval aadressil ettevõtte veebisait, sinna on kogutud ka palju muud kasulikku materjali.
 
Teine suur puudus on litsentsi hind. See on kümneid tuhandeid dollareid aastas ühe protsessori kohta. Selliseid kulutusi saavad endale lubada vaid suured ettevõtted. Hiljuti on KX muutnud oma litsentsipoliitika paindlikumaks ja annab võimaluse tasuda ainult kasutusaja eest või rentida KDB+ Google'i ja Amazoni pilves. KX pakub ka allalaadimist tasuta versioon mitteärilistel eesmärkidel (32-bitine versioon või 64-bitine nõudmisel).
 

konkurentide

Sarnastel põhimõtetel üles ehitatud spetsialiseeritud andmebaase on üsna palju – veerulised, mälusisesed, väga suurtele andmemahtudele keskendunud. Probleem on selles, et need on spetsiaalsed andmebaasid. Ilmekas näide on Clickhouse. Sellel andmebaasil on andmete kettale salvestamiseks ja indeksi koostamiseks väga sarnane põhimõte KDB+-ga; see täidab mõned päringud kiiremini kui KDB+, kuigi mitte oluliselt. Aga isegi andmebaasina on Clickhouse rohkem spetsialiseerunud kui KDB+ - veebianalüütika vs suvalised aegread (see erinevus on väga oluline - selle tõttu pole näiteks Clickhouse'is võimalik kasutada kirjete järjestamist). Kuid mis kõige tähtsam, Clickhouse'il puudub KDB+ mitmekülgsus, keel, mis võimaldaks töödelda andmeid otse andmebaasis, mitte laadida need esmalt eraldi rakendusse, koostada suvalisi SQL-avaldisi, rakendada suvalisi funktsioone päringus, luua protsesse. ei ole seotud ajaloolise andmebaasi funktsioonide täitmisega. Seetõttu on KDB+ raske võrrelda teiste andmebaasidega, need võivad teatud kasutusjuhtudel olla paremad või klassikaliste andmebaasiülesannete puhul lihtsalt paremad, kuid teist sama tõhusat ja mitmekülgset tööriista ajutiste andmete töötlemiseks ma ei tea.
 

Pythoni integreerimine

KDB+ kasutamise hõlbustamiseks inimestele, kes seda tehnoloogiat ei tunne, lõi KX teegid, et integreeruda Pythoniga ühe protsessi jooksul. Saate kutsuda mis tahes Pythoni funktsiooni Q-st või vastupidi - kutsuda Pythonist mis tahes Q-funktsiooni (eriti QSQL-i avaldisi). Raamatukogud teisendavad vajaduse korral (mitte alati efektiivsuse huvides) andmeid ühe keele vormingust teise keele vormingusse. Seetõttu elavad Q ja Python nii tihedas sümbioosis, et nendevahelised piirid on hägused. Tänu sellele on programmeerijal ühelt poolt täielik juurdepääs arvukatele kasulikele Pythoni teekidele, teisalt saab ta kiire baasi Pythoni integreeritud suurandmetega töötamiseks, mis on eriti kasulik masinõppega tegelejatele. või modelleerimine.
 
Q-ga töötamine Pythonis:

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')  

Viited

Ettevõtte sait - https://kx.com/
Veebisait arendajatele - https://code.kx.com/v2/
Raamat Q surelikele (inglise keeles) – https://code.kx.com/q4m3/
Artiklid KDB+/Q rakenduste kohta kx töötajatelt - https://code.kx.com/v2/wp/

Allikas: www.habr.com

Lisa kommentaar